Nadeem Shabir · Staff Engineer at BibliU
Editor · Shell · Window Manager · Status Bar · Terminals · Hyper Key · Borders · About
A keyboard-driven macOS setup built around Neovim (Lua), Nushell, AeroSpace, and SketchyBar. Tokyo Night palette, JetBrains Mono everywhere, one Hyper key to rule them all.
| Layer | Tool | Why |
|---|---|---|
| Editor | Neovim · Lua | Native LSP, lazy.nvim, no VimScript |
| Shell | Nushell | Structured data, real types, sane completions |
| Window manager | AeroSpace | Tiling, persistent workspaces, scriptable |
| Status bar | SketchyBar | Per-pixel control; no Apple menu compromises |
| Terminals | Ghostty + WezTerm | GPU-accelerated, identical Catppuccin look |
| Keyboard | Karabiner-Elements | § → Hyper |
| Borders | JankyBorders | Active/inactive window outlines |
| History | Atuin + zoxide | Encrypted shared history; frecency cd |
git clone https://github.com/kiyanwang/dotfiles ~/dotfiles
cd ~/dotfiles
./bootstrap.shbootstrap.sh installs Homebrew, every tool above, nvm, and the Rust toolchain — then symlinks each subdirectory into the place its tool expects to find it:
dotfiles/nushell/ → ~/Library/Application Support/nushell/
dotfiles/nvim/ → ~/.config/nvim/
dotfiles/aerospace/ → ~/.aerospace.toml
dotfiles/ghostty/ → ~/.config/ghostty/
dotfiles/karabiner/ → ~/.config/karabiner/
Karabiner-Elements and AeroSpace need accessibility permissions in System Settings → Privacy & Security before they'll wake up properly.
VimScript and CoC are out. The whole config is Lua, lazy-loaded, and uses Neovim 0.11's native LSP API.
- lazy.nvim plugin manager with a committed lockfile
- Native LSP via
vim.lsp.config/vim.lsp.enable— no CoC - Mason auto-installs servers:
ts_ls,lua_ls,jsonls,yamlls,bashls,eslint,intelephense,dockerls,ansiblels,cssls,html. Nushell LSP vianu --lsp. - nvim-cmp + LuaSnip with the supertab pattern
- Telescope (fzf-native, ui-select, undo) for anything findable
- Conform formats on save — prettier, stylua, php-cs-fixer
- Treesitter for syntax + textobjects, Gitsigns, Flash, Which-Key
- Catppuccin Mocha, transparent, alpha-nvim dashboard
Keymap
| Keys | What |
|---|---|
jj |
exit insert mode |
,w |
save |
,ff / ,fg |
find file / live grep |
// / ?? |
live grep / word under cursor |
gd / gr / K |
definition / references / hover |
,rn / ,a |
rename / code actions |
[d / ]d |
previous / next diagnostic |
,gg |
lazygit in a new tab |
Tab |
completion (supertab) |
Ctrl-h/j/k/l |
move between splits and tmux panes |
Bash is gone. Everything is structured data — ls returns rows, ps returns rows, http get returns parsed JSON. Pipelines read like queries:
ps | where cpu > 5 | sort-by cpu --reverse | first 10- zoxide for
zjumps - atuin for shared, encrypted, fzf-style history
- eza powering
llandtree - Homebrew + nvm's default Node bin on
PATH(set inenv.nuso zoxide init can find them) vi/vim/viewall alias tonvim— no muscle memory tax
Aliases worth knowing
| Alias / command | Does |
|---|---|
ll [path] |
ls -a sorted by type and name |
tree |
eza --tree --level=2 --long --icons --git |
whatsmyip |
http get ipecho.net/plain |
clc |
claude --allow-dangerously-skip-permissions --chrome |
Tiling, scriptable, no SIP disable. Workspaces 1–6 live on the main monitor, 7–9 on the secondary. They persist whether they hold windows or not. Mouse follows focus across monitors.
Why
ctrl-alt-cmd-shiftand not plainalt-1..9? UK ISO keyboards type#onalt-3. So workspace switching moved to Hyper (via the§key), freeingalt-3to actually type a hash.
Keymap
| Keys | Action |
|---|---|
alt-h/j/k/l |
focus left / down / up / right |
alt-shift-h/j/k/l |
move window |
alt-shift-1..9 |
move window to workspace |
ctrl-alt-cmd-shift-1..9 |
switch workspace (Hyper-1..9 via Karabiner) |
alt-tab |
last workspace |
alt-y |
toggle floating ↔ tiling |
alt-/ / alt-, |
tiles ↔ accordion layout |
alt-f |
fullscreen |
alt-= / alt-- |
resize |
alt-enter |
new Ghostty window |
alt-shift-enter |
new WezTerm window |
alt-b |
new Chrome window |
alt-shift-; |
enter service mode (r reset, f float, ← close-others, joins) |
Apple's menu bar is non-negotiable about layout. SketchyBar isn't.
- Workspace pills, grouped:
[ 7 8 9 │ 1 2 3 4 5 6 ]. Active workspace highlights on whichever monitor it lives on. - Front-app pill with the app's icon glyph (sketchybar-app-font).
- Volume slider on hover, scroll-to-adjust, click to open Sound settings.
- Mic mute toggle, battery, RAM, CPU.
- Clock formatted
Thu 2 Apr · 14:32. - Tokyo Night palette, blurred background, rounded brackets.
Workspace updates trigger from AeroSpace via sketchybar --trigger aerospace_workspace_change.
Same face on both. Catppuccin Macchiato, SauceCodePro Nerd Font, 80% opacity with blur, blinking red block cursor, hidden titlebar.
alt-enter→ new Ghostty window (via osascript so it actually opens a new window, not just focuses)alt-shift-enter→ new WezTerm window
Ghostty is the daily driver. WezTerm comes out for SSH multiplexing or Lua-scripted layouts.
The trick: I never use § (the section sign). On UK ISO Macs it sits where US keyboards put backtick. Karabiner remaps it to Hyper = ctrl + opt + shift + cmd — a chord nothing else binds.
- Tap
§→`(you still get a backtick) - Hold
§→ Hyper modifier
Works on the Keychron and the built-in MacBook ISO keyboard — the laptop reports § as non_us_backslash, so there's a device-scoped manipulator for that case.
Round corners. Active red #f7768e. Inactive blue #7aa2f7. Subtle — the sort of thing you only stop noticing because it's always right.
| Token | Hex | |
|---|---|---|
![]() |
bg | #1a1b26 Tokyo Night |
![]() |
accent | #7aa2f7 blue |
![]() |
highlight | #f7768e salmon |
![]() |
site | #ff8400 orange (kiyanwang.github.io) |
Code in JetBrains Mono, terminals in SauceCodePro Nerd Font.
Built and maintained by Nadeem Shabir — Staff Engineer at BibliU. Platform builder, team grower, occasional startup advisor.
→ kiyanwang.github.io → github.com/kiyanwang
MIT — see LICENSE.




