MacOS Ricing Setup

My keyboard-driven macOS setup with AeroSpace, SketchyBar, Rex, Fish, Neovim, the Houses theme and shared dotfiles.

Pastel illustration of keyboard-controlled workspaces

Earlier version of my macOS setup with Tokyo Night

My macOS setup is built around one idea: getting to the right application, terminal pane, or editor split should be muscle memory. AeroSpace gives applications predictable workspaces, Rex handles my terminal sessions, and Fish and Neovim take care of most of the work inside them. Shared dotfiles keep the pieces organized, with a wallpaper-derived Houses palette tying the environment together.

The desktop screenshot above shows an earlier Tokyo Night version of the setup. The configuration described below reflects the newer Houses theme and my move to Rex as my only terminal.

NOTE

This setup keeps evolving, so this article focuses on the workflow and the important configuration points rather than every installed plugin. For the latest files, reference manishprivet/.dotfiles. Some paths and integrations are specific to my machines; review them before using the setup yourself.

Overview

I have based my macOS setup to make it keyboard driven as much as possible, and a huge part of the UX is inspired by the i3 window manager on Linux. The setup features:

  • Window Management: AeroSpace for tiling window management
  • Status Bar: SketchyBar for a customizable menu bar
  • Terminal: Rex for sessions, tabs, panes, and keyboard-driven navigation
  • Shell: Fish with Starship, Zoxide, FZF, and custom functions
  • Editor: Neovim built on LazyVim
  • Window Borders: JankyBorders with a coral active-window highlight
  • Theme: Houses, a shared palette derived from my houses wallpaper

Basic Requirements

Before we begin, ensure you have:

  • macOS (this setup is tested only on macOS)
  • Command Line Tools for Xcode (For git and stuff)
  • Basic familiarity with terminal commands
  • Homebrew Package Manager
  • Rex installed for the terminal workflow described below

Window Management with AeroSpace

AeroSpace brings i3-like window management to macOS. I use it to switch workspaces directly from the keyboard and arrange windows without relying on Mission Control. My configuration lives in ~/.config/aerospace/aerospace.toml.

brew install --cask nikitabobko/tap/aerospace

Setup Philosophy

My workspace philosophy is inspired by ThePrimeagen's approach: give each application or category of applications a predictable home, so I don't have to remember where I last left a window.

I generally keep my workspace configuration like this:

  • Workspace 1: Notion Calendar
  • Workspace 2: Rex
  • Workspace 3: Browser, with rules for Chrome, Arc, and Safari
  • Workspace 4: Chat, with rules for Slack, WhatsApp, and Telegram
  • Workspace 5: Notes, with rules for Obsidian and Notion

These are separate workspaces, not applications that all need to be tiled on screen together. The config also has shortcuts for workspaces 6–9 when I need extra space.

The workspaces can be configured by adding something like this in the aerospace config for each workspace:

# In [mode.main.binding]: switch directly to the terminal workspace.
alt-w = 'workspace 2'
# Move the focused window there and follow it.
alt-shift-w = ['move-node-to-workspace 2', 'workspace 2']

The apps can be configured to open in the designated workspace by adding something like this in the config for each app:

[[on-window-detected]]
if.app-id = 'com.superlogical.rex'
run = "move-node-to-workspace 2"

You can find an application's ID with aerospace list-apps while it is running. I also use Alt+H/J/K/L to focus windows, Alt+Shift+H/J/K/L to move them, and Alt+Tab to switch back to the previous workspace. Workspace changes trigger a SketchyBar event so the bar stays in sync.

References: my AeroSpace config and Josean Martinez's walkthrough.

Status Bar with SketchyBar

SketchyBar replaces the default macOS menu bar with a highly customizable alternative.

SketchyBar in the earlier Tokyo Night version of my setup

My setup includes:

  • Aerospace Workspaces with icons of the apps in them
  • The current focused app
  • Weather from WeatherAPI.com
  • Youtube Music status with Album Art + click to pause/play, right click to skip to next song and middle click to open app
  • A clickable keep-awake toggle built around macOS's caffeinate command
  • Battery
  • Volume (Integrated with BetterDisplay to get volume from Monitor speakers as well)
  • Calendar
  • Notion Calendar Integration (Shows upcoming meetings + clickable to open the Google Meet link if the meeting is online)

The CPU and Wi-Fi items are available in the repo but are currently disabled in sketchybarrc.

Hide the native menu bar automatically in System Settings so it doesn't compete with SketchyBar. The exact settings location depends on your macOS version.

The configuration is modular: sketchybarrc loads item definitions, plugins implement their behavior, and colors.sh supplies the Houses colors. My custom components live in .config/sketchybar/. The music integration expects a compatible local YouTube Music API; the upcoming-meeting integration uses Notion Calendar.

Rex Terminal

Rex is now my only terminal. Its sessions, tabs, and panes give me the structure I need inside the dedicated AeroSpace terminal workspace.

My keyboard configuration lives in .config/rex/init.lua. It carries over familiar bindings from my tmux setup:

  • Cmd+D and Cmd+Shift+D split right and down.
  • Cmd+Shift+Enter zooms a pane.
  • Ctrl+S is the prefix for tab creation, switching, renaming, pane operations, and copy mode.
  • Ctrl+H/J/K/L navigates Neovim splits or Rex panes, with a matching Neovim configuration to hand off at editor edges.
  • Ctrl+Alt+Arrow resizes panes by five cells.

For example, these bindings create and zoom panes:

rex.bind("cmd+d", "pane.split", { direction = "right" })
rex.bind("cmd+shift+d", "pane.split", { direction = "down" })
rex.bind("cmd+shift+enter", "pane.zoom")

Local extensions add floating panes, Lazygit access, tab navigation, tab numbers, and session persistence. Rex restores layouts natively; the custom persistence extension also tracks agent conversations and uses a Fish readiness handshake to resume them.

After editing the Lua configuration, validate and reload it explicitly—Rex does not watch the file automatically:

rex config check
rex config reload

The repo also contains a Rex-importable Houses Light theme. Terminal appearance is separate from the Lua keybinding configuration.

Fish Shell Configuration

Fish is my shell of choice for its user-friendly features and powerful scripting capabilities. The configuration (.config/fish/config.fish) includes:

  • Houses syntax and completion colors, with dark and light palette options
  • Starship prompt integration
  • Zoxide for smart directory jumping
  • Custom functions and abbreviations
  • FZF integration for fuzzy finding
  • direnv integration for per-directory environments
  • Rex CLI discovery, preferring the running server's CLI when inside Rex

Starship Prompt

Starship provides a minimal, blazing-fast, and customizable prompt. My configuration (.config/starship.toml) includes:

  • Custom success/error symbols
  • Git status indicators with custom icons
  • Directory truncation with icon substitutions
  • Language-specific icons for different project types
  • A Houses palette and a transient prompt in Fish

Neovim Setup

My Neovim configuration is built on top of LazyVim, providing a full IDE experience. Located in .config/nvim/, it includes:

  • LSP support for multiple languages
  • Treesitter for syntax highlighting
  • Telescope for fuzzy finding
  • Git integration
  • The custom Houses colorscheme selected through LazyVim
  • Navigation between editor splits and Rex panes

Window Borders with JankyBorders

JankyBorders makes the focused window easy to spot. My configuration (.config/borders/bordersrc) uses:

style=round
width=7.0
active_color=0xffea6962
inactive_color=0xff504945

This creates rounded borders with a coral highlight on the active window and a muted warm border on inactive windows.

Shared Houses Theme

The current theme is Houses, derived from wallpapers/houses.jpg. The shared palette reference combines warm charcoal backgrounds with parchment-colored text, coral highlights, seafoam, olive, and ochre.

The important distinction is that the palette JSON is a reference, not a live theme loader. Fish, Starship, Neovim, SketchyBar, Borders, tmux, and other themed tools mirror these colors in their own configuration files. Changing the JSON alone will not recolor the environment.

There is also a companion light palette. For example, Fish's houses_theme_mode switches its colors and selects the corresponding Lazygit theme, while Starship has separate houses and houses-light palettes.

Additional Tools

The setup includes many developer tools installed via Homebrew:

  • Version Management: mise for managing multiple runtime versions
  • Git Enhancements: lazygit, git-delta
  • System Monitoring: btop, htop
  • File Search: ripgrep, fd, fzf
  • Modern CLI Tools: eza (ls replacement), bat (cat replacement)
  • File Management: Yazi, installed through Homebrew; there is no longer a managed Yazi theme configuration in this repo

My tmux configuration remains in the dotfiles, including its Ctrl+S prefix, Vim-style navigation, and restore plugins. Rex now provides the terminal and pane workflow described above, so tmux is not a required extra layer inside it.

Customization Tips

  1. Theme Consistency: Use .config/houses/ as the palette reference, then update the tool-specific colors:

  2. Keyboard Shortcuts: Most shortcuts are defined in:

  3. Adding New Tools: Simply add them to .Brewfile and run brew bundle

Maintenance

Run repository maintenance commands from the dotfiles checkout, not from an arbitrary project directory:

# Pull latest dotfiles changes
cd ~/.dotfiles
git pull

# Install missing packages declared in the Brewfile
brew bundle --file .Brewfile

# Preview the managed symlink layout without changing it
stow -n -v .

On a fresh setup, review the dry run before applying stow . once from the repo root. Existing symlinks already point at the tracked files, so ordinary edits do not require another Stow run. Some directories, including scripts and wallpapers, are excluded from deployment.

Review scripts/setup.sh before running the full bootstrap: it installs packages, changes the login shell, installs plugins and Rust, downloads the SketchyBar font, and deploys the dotfiles. It is more than a routine update command. The Fish helper also assumes an Apple Silicon Homebrew path.

Reload the affected tools after configuration changes. For Rex, use rex config check followed by rex config reload; for the other tools, use their own reload mechanism. Do not assume that updating a shared palette reference automatically reloads every application.

Conclusion

The useful part of this setup is the predictable structure: calendar, terminal, browser, chat, and notes each have a home; Rex and Neovim share familiar navigation; and the Houses palette makes the pieces feel related without being the reason they work.

Feel free to fork the repository and customize it to your needs. The modular structure makes it easy to pick and choose components or modify existing ones.

Happy ricing! 🚀

References

  1. manishprivet/.dotfileshttps://github.com/manishprivet/.dotfiles
  2. AeroSpacehttps://nikitabobko.github.io/AeroSpace/
  3. SketchyBarhttps://github.com/FelixKratz/SketchyBar
  4. Rexhttps://www.superlogical.com/rex
  5. Fishhttps://fishshell.com/
  6. Neovimhttps://neovim.io/
  7. JankyBordershttps://github.com/FelixKratz/JankyBorders
  8. Homebrew Package Managerhttps://brew.sh/
  9. Rexhttps://www.superlogical.com/rex/docs
  10. ~/.config/aerospace/aerospace.tomlhttps://github.com/manishprivet/.dotfiles/blob/main/.config/aerospace/aerospace.toml
  11. ThePrimeagen's approachhttps://www.youtube.com/clip/Ugkxe1t01kmVKUJSv6uycFHQPmTA48b7Q0Np
  12. Josean Martinez's walkthroughhttps://youtu.be/DBifQv9AYhc?si=eVt_k2e_lEpGV6u7
  13. .config/sketchybar/https://github.com/manishprivet/.dotfiles/blob/main/.config/sketchybar
  14. Notion Calendarhttps://www.notion.com/product/calendar
  15. .config/rex/init.luahttps://github.com/manishprivet/.dotfiles/blob/main/.config/rex/init.lua
  16. Houses Light themehttps://github.com/manishprivet/.dotfiles/blob/main/.config/rex/themes/Houses%20Light
  17. .config/fish/config.fishhttps://github.com/manishprivet/.dotfiles/blob/main/.config/fish/config.fish
  18. Starshiphttps://starship.rs/
  19. .config/starship.tomlhttps://github.com/manishprivet/.dotfiles/blob/main/.config/starship.toml
  20. LazyVimhttps://www.lazyvim.org/
  21. .config/nvim/https://github.com/manishprivet/.dotfiles/tree/main/.config/nvim
  22. .config/borders/bordersrchttps://github.com/manishprivet/.dotfiles/blob/main/.config/borders/bordersrc
  23. wallpapers/houses.jpghttps://github.com/manishprivet/.dotfiles/blob/main/wallpapers/houses.jpg
  24. palette referencehttps://github.com/manishprivet/.dotfiles/blob/main/.config/houses/palette.json
  25. misehttps://github.com/jdx/mise
  26. lazygithttps://github.com/jesseduffield/lazygit
  27. git-deltahttps://github.com/dandavison/delta
  28. btophttps://github.com/aristocratos/btop
  29. htophttps://htop.dev/
  30. ripgrephttps://github.com/BurntSushi/ripgrep
  31. fdhttps://github.com/sharkdp/fd
  32. fzfhttps://github.com/junegunn/fzf
  33. ezahttps://github.com/eza-community/eza
  34. bathttps://github.com/sharkdp/bat
  35. Yazihttps://github.com/sxyazi/yazi
  36. tmux configurationhttps://github.com/manishprivet/.dotfiles/blob/main/.tmux.conf
  37. .config/houses/https://github.com/manishprivet/.dotfiles/tree/main/.config/houses
  38. .config/rex/themes/https://github.com/manishprivet/.dotfiles/tree/main/.config/rex/themes
  39. LazyVim theme selectionhttps://github.com/manishprivet/.dotfiles/blob/main/.config/nvim/lua/plugins/colorscheme.lua
  40. .Brewfilehttps://github.com/manishprivet/.dotfiles/blob/main/.Brewfile
  41. scripts/setup.shhttps://github.com/manishprivet/.dotfiles/blob/main/scripts/setup.sh
Send a correctionMore writingSubscribe via RSS