| Tool | What it does |
|---|---|
| AeroSpace | Tiling window manager (i3-like keybinds) |
| JankyBorders | Colored borders on the focused window |
| SketchyBar | Custom menu bar with workspaces, system info, app icons, optional next calendar event |
| Cursor | Editor (VSCode fork) with settings, keybindings, and extensions |
| iTerm2 | Terminal with color scheme presets |
| Raycast | Spotlight replacement with extensions and custom commands |
| Spicetify | Spotify client customization (themes, extensions, marketplace) |
Switch the entire stack between color themes with one command:
- Gruvbox Dark
- Nord
- Catppuccin Mocha
- Tokyo Night
Each theme applies to JankyBorders, SketchyBar, Cursor, iTerm2, and Chrome.
git clone https://github.com/<you>/dotfiles.git ~/dotfiles
cd ~/dotfiles
./setup.shsetup.sh handles everything:
- Installs Homebrew if missing
- Installs all packages, casks, and fonts via
Brewfile - Starts JankyBorders and SketchyBar
- Symlinks configs into
~/.configand Cursor's config directory - Installs Cursor extensions from
cursor/extensions.txt - Imports iTerm2 color presets
- Installs Spicetify with Marketplace (pick a theme inside Spotify)
Note: Sign into Raycast to sync your settings.
| Script | Usage |
|---|---|
scripts/switch-theme.sh <theme> |
Switch color theme across all tools |
scripts/sync-cursor.sh |
Export currently installed Cursor extensions to cursor/extensions.txt |
scripts/reload.sh |
Reload AeroSpace, SketchyBar, and JankyBorders |
scripts/link.sh |
Re-link config symlinks (called by setup.sh) |
scripts/setup-google-calendar.sh |
Set up Google Calendar in SketchyBar (optional, see below) |
Run scripts/switch-theme.sh with no arguments to list available themes.
The bar can show your next calendar event in the center. It uses the Google Calendar API with OAuth, so it works with org/shared calendars too (not just your primary).
- Go to Google Cloud Console:
- Create a project (or pick an existing one)
- Enable the Google Calendar API
- Go to Credentials → Create credentials → OAuth client ID → type Desktop app
- Download the JSON
- Save it as
~/.config/sketchybar/google_calendar_credentials.json - Run the setup script:
./scripts/setup-google-calendar.shThat's it. The script installs Python dependencies, opens a browser for login, lists your calendars, and reloads the bar.
After setup, a config file is created at ~/.config/sketchybar/google_calendar_config.json. Add calendar names to the "exclude" array to hide them from the bar:
{"exclude": ["OOO", "Holidays in Argentina"]}Reload the bar after editing: sketchybar --reload. To see your calendars and which ones are excluded, run:
~/.config/sketchybar/.venv/bin/python3 ~/.config/sketchybar/plugins/google_calendar.py --list-calendarsIf something goes wrong, the bar shows a short error instead of the event name:
| Bar label | Fix |
|---|---|
⚠ deps not installed |
Run ./scripts/setup-google-calendar.sh |
⚠ no credentials file |
Download the OAuth JSON from Google Cloud Console (step 1–2 above) |
⚠ run --auth first |
Run ./scripts/setup-google-calendar.sh |
⚠ token expired |
Re-run ./scripts/setup-google-calendar.sh |
⚠ enable Calendar API |
Open Calendar API and click Enable |
⚠ access denied |
Workspace admin may need to allowlist the OAuth client, or use a personal Google account |
⚠ API error (NNN) |
Run the script manually to see the full error: ~/.config/sketchybar/.venv/bin/python3 ~/.config/sketchybar/plugins/google_calendar.py |
⚠ calendar error |
Same as above — run manually to see the traceback |
Workspace note: A Google Workspace admin can block third-party OAuth clients until the app is allowlisted.
- AeroSpace guide
- JankyBorders docs
- SketchyBar config reference
- Cursor docs
- iTerm2 docs
- Raycast manual
- Spicetify docs
Reload configs:
| What | How |
|---|---|
| Reload everything | scripts/reload.sh or alt-shift-; then a |
| Reload AeroSpace only | alt-shift-; then esc |
| Reload SketchyBar only | sketchybar --reload |
AeroSpace keybindings (main mode):
| Keys | Action |
|---|---|
ctrl-alt-arrows |
Focus window |
ctrl-alt-shift-arrows |
Move window |
alt-1 .. alt-9 |
Switch workspace |
alt-shift-1 .. alt-shift-9 |
Move window to workspace |
alt-f |
Fullscreen |
alt-/ |
Tiles layout |
alt-, |
Accordion layout |
alt-tab |
Back-and-forth workspace |
alt-shift-tab |
Move workspace to next monitor |
alt-0 |
Switch to temp workspace |
alt-shift-0 |
Move window to temp workspace |
alt-shift-d |
Dev layout |
alt-shift-r |
Enter resize mode |
alt-shift-; |
Enter service mode |
Resize mode (alt-shift-r): h/j/k/l to resize, b to balance, esc to exit.
Service mode (alt-shift-;): esc reload config, r flatten tree, f toggle float, backspace close other windows.
dotfiles/
├── setup.sh # Full setup entry point
├── Brewfile # Homebrew dependencies
├── scripts/
│ ├── link.sh # Symlink configs
│ ├── switch-theme.sh # Theme switcher
│ ├── sync-cursor.sh # Export Cursor extensions
│ └── setup-google-calendar.sh # Google Calendar setup (optional)
├── aerospace/
│ ├── aerospace.toml # Window manager config
│ └── scripts/ # Aerospace helper scripts
├── borders/
│ ├── bordersrc # JankyBorders config
│ └── colors.sh # Active border colors (auto-generated)
├── sketchybar/
│ ├── sketchybarrc # Bar config
│ ├── theme.sh # Active theme + style tokens (auto-generated)
│ └── plugins/ # Bar item scripts (incl. google_calendar.py)
├── cursor/
│ ├── settings.json # Editor settings
│ ├── keybindings.json # Keybindings
│ └── extensions.txt # Extension list
└── themes/
├── gruvbox/
├── nord/
├── catppuccin-mocha/
└── tokyo-night/
