A comprehensive macOS development environment managed as a git repository cloned directly to ~/.config. Because all XDG-compliant tools look in ~/.config by default, every config file is automatically in the right place with no extra symlinking needed.
The setup includes a full Neovim IDE configuration, Kitty terminal, Zsh shell config, global Git settings, ESLint / Prettier / TypeScript configs, and a collection of utility shell scripts for daily development.
Theme: The entire environment uses the Catppuccin Frappé color palette — Neovim, Kitty, and all terminal tools are configured to match.
All configuration lives under ~/.config:
nvim/kitty/fish/configs/.zshrc, .gitconfig, .tmux.conf, etc.)bin/android/, dev/, utils.sh)git/assets/XDG compliant: Cloning to ~/.config means tools like Neovim, Kitty, Fish, and gh pick up their configs automatically without any manual linking.
neovim 0.10+node 18+ / nvmgitkittyzshbrewJetBrainsMono Nerd FontClone the repository directly to ~/.config:
# Clone directly to ~/.config (XDG base dir)
git clone https://github.com/san-siva/dotfiles ~/.config
# If ~/.config already exists
cd ~/.config
git init
git remote add origin https://github.com/san-siva/dotfiles
git pull origin mainThree setup scripts handle the full environment bootstrap. Run them in order, or use setup-environment to run all three at once.
The top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
Installs all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
Creates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
A full IDE experience built in Lua using lazy.nvim. Entry point is nvim/init.lua; leader key is ,.
nvim/
├── init.lua Entry point — options, loads bindings & plugins
├── lua/
│ ├── bindings/
│ │ ├── mappings.lua Key mappings
│ │ └── autocmd.lua Autocommands
│ ├── core/
│ │ └── large-files.lua Large file detection & feature toggling
│ ├── plugins/
│ │ ├── init.lua Plugin list (lazy.nvim)
│ │ ├── lspconfig.lua LSP server configs
│ │ ├── conform.lua Format-on-save setup
│ │ └── ...
│ ├── shared_ftplugins/
│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
│ └── utils/
│ ├── large-file-check.lua
│ └── wildignores.lua
└── ftplugin/
├── typescript.lua
├── javascript.lua
├── typescriptreact.lua
├── javascriptreact.lua
├── md.lua
├── python.lua
└── java.luaSet NVIM_NPM=1 to open Neovim with all plugins disabled — useful when invoked inside Node.js scripts or tooling where startup time matters.
<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.
Config at kitty/kitty.conf. Kitty is the primary terminal — configured for a clean, distraction-free experience with the full Catppuccin Frappé color scheme.
JetBrainsMono Nerd Font Mono, 13ptthemes/frappe.conf)150c × 50cblockmacos_option_as_alt yesSwitching themes: All four Catppuccin flavors are in kitty/themes/ — change the include line to latte.conf, macchiato.conf, or mocha.conf to switch.
Config at configs/.tmux.conf (symlinked to ~/.tmux.conf). Uses TPM for plugin management with Catppuccin-matching status bar colors.
C-a10000prefix + h/j/k/l (vim-style)prefix + i/u (next/prev), prefix + p (last)tmux-resurrecttmux-yankPersonal and work profiles with separate SSH keys using includeIf and SSH host aliases
All scripts in bin/ are on PATH and share a common utility library at bin/utils.sh.
wireless-adb <ip>adb-install <apk>adb-reverse <port>adb-uninstall <package>kill-port <port>setup-ssh-agentpwdcreinstall-claudereinstall-gitsyThe assets/ directory contains static resources:
screenshot.pngcatppuccin/JetBrainsMonoPatched.zipThis project is licensed under the MIT License.
Author: Santhosh Siva
GitHub: https://github.com/san-siva
A comprehensive macOS development environment managed as a git repository cloned directly to ~/.config. Because all XDG-compliant tools look in ~/.config by default, every config file is automatically in the right place with no extra symlinking needed.
The setup includes a full Neovim IDE configuration, Kitty terminal, Zsh shell config, global Git settings, ESLint / Prettier / TypeScript configs, and a collection of utility shell scripts for daily development.
Theme: The entire environment uses the Catppuccin Frappé color palette — Neovim, Kitty, and all terminal tools are configured to match.
All configuration lives under ~/.config:
nvim/kitty/fish/configs/.zshrc, .gitconfig, .tmux.conf, etc.)bin/android/, dev/, utils.sh)git/assets/XDG compliant: Cloning to ~/.config means tools like Neovim, Kitty, Fish, and gh pick up their configs automatically without any manual linking.
neovim 0.10+node 18+ / nvmgitkittyzshbrewJetBrainsMono Nerd FontClone the repository directly to ~/.config:
# Clone directly to ~/.config (XDG base dir)
git clone https://github.com/san-siva/dotfiles ~/.config
# If ~/.config already exists
cd ~/.config
git init
git remote add origin https://github.com/san-siva/dotfiles
git pull origin mainThree setup scripts handle the full environment bootstrap. Run them in order, or use setup-environment to run all three at once.
The top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
Installs all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
Creates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
A full IDE experience built in Lua using lazy.nvim. Entry point is nvim/init.lua; leader key is ,.
nvim/
├── init.lua Entry point — options, loads bindings & plugins
├── lua/
│ ├── bindings/
│ │ ├── mappings.lua Key mappings
│ │ └── autocmd.lua Autocommands
│ ├── core/
│ │ └── large-files.lua Large file detection & feature toggling
│ ├── plugins/
│ │ ├── init.lua Plugin list (lazy.nvim)
│ │ ├── lspconfig.lua LSP server configs
│ │ ├── conform.lua Format-on-save setup
│ │ └── ...
│ ├── shared_ftplugins/
│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
│ └── utils/
│ ├── large-file-check.lua
│ └── wildignores.lua
└── ftplugin/
├── typescript.lua
├── javascript.lua
├── typescriptreact.lua
├── javascriptreact.lua
├── md.lua
├── python.lua
└── java.luaSet NVIM_NPM=1 to open Neovim with all plugins disabled — useful when invoked inside Node.js scripts or tooling where startup time matters.
<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.
Config at kitty/kitty.conf. Kitty is the primary terminal — configured for a clean, distraction-free experience with the full Catppuccin Frappé color scheme.
JetBrainsMono Nerd Font Mono, 13ptthemes/frappe.conf)150c × 50cblockmacos_option_as_alt yesSwitching themes: All four Catppuccin flavors are in kitty/themes/ — change the include line to latte.conf, macchiato.conf, or mocha.conf to switch.
Config at configs/.tmux.conf (symlinked to ~/.tmux.conf). Uses TPM for plugin management with Catppuccin-matching status bar colors.
C-a10000prefix + h/j/k/l (vim-style)prefix + i/u (next/prev), prefix + p (last)tmux-resurrecttmux-yankPersonal and work profiles with separate SSH keys using includeIf and SSH host aliases
All scripts in bin/ are on PATH and share a common utility library at bin/utils.sh.
wireless-adb <ip>adb-install <apk>adb-reverse <port>adb-uninstall <package>kill-port <port>setup-ssh-agentpwdcreinstall-claudereinstall-gitsyThe assets/ directory contains static resources:
screenshot.pngcatppuccin/JetBrainsMonoPatched.zipThis project is licensed under the MIT License.
Author: Santhosh Siva
GitHub: https://github.com/san-siva
A comprehensive macOS development environment managed as a git repository cloned directly to ~/.config. Because all XDG-compliant tools look in ~/.config by default, every config file is automatically in the right place with no extra symlinking needed.
The setup includes a full Neovim IDE configuration, Kitty terminal, Zsh shell config, global Git settings, ESLint / Prettier / TypeScript configs, and a collection of utility shell scripts for daily development.
Theme: The entire environment uses the Catppuccin Frappé color palette — Neovim, Kitty, and all terminal tools are configured to match.
All configuration lives under ~/.config:
nvim/kitty/fish/configs/.zshrc, .gitconfig, .tmux.conf, etc.)bin/android/, dev/, utils.sh)git/assets/XDG compliant: Cloning to ~/.config means tools like Neovim, Kitty, Fish, and gh pick up their configs automatically without any manual linking.
neovim 0.10+node 18+ / nvmgitkittyzshbrewJetBrainsMono Nerd FontClone the repository directly to ~/.config:
# Clone directly to ~/.config (XDG base dir)
git clone https://github.com/san-siva/dotfiles ~/.config
# If ~/.config already exists
cd ~/.config
git init
git remote add origin https://github.com/san-siva/dotfiles
git pull origin mainThree setup scripts handle the full environment bootstrap. Run them in order, or use setup-environment to run all three at once.
The top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
1~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
Installs all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
Creates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
1# Clone directly to ~/.config (XDG base dir)
2git clone https://github.com/san-siva/dotfiles ~/.config
3
4# If ~/.config already exists
5cd ~/.config
6git init
7git remote add origin https://github.com/san-siva/dotfiles
8git pull origin mainThe top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
1~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
1~/.config/bin/dev/setup/setup-environmentInstalls all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
1~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
1~/.config/bin/dev/setup/install-global-depsCreates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
1~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
1~/.config/bin/dev/setup/link-dotfilesA full IDE experience built in Lua using lazy.nvim. Entry point is nvim/init.lua; leader key is ,.
nvim/
├── init.lua Entry point — options, loads bindings & plugins
├── lua/
│ ├── bindings/
│ │ ├── mappings.lua Key mappings
│ │ └── autocmd.lua Autocommands
│ ├── core/
│ │ └── large-files.lua Large file detection & feature toggling
│ ├── plugins/
│ │ ├── init.lua Plugin list (lazy.nvim)
│ │ ├── lspconfig.lua LSP server configs
│ │ ├── conform.lua Format-on-save setup
│ │ └── ...
│ ├── shared_ftplugins/
│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
│ └── utils/
│ ├── large-file-check.lua
│ └── wildignores.lua
└── ftplugin/
├── typescript.lua
├── javascript.lua
├── typescriptreact.lua
├── javascriptreact.lua
├── md.lua
├── python.lua
└── java.luaSet NVIM_NPM=1 to open Neovim with all plugins disabled — useful when invoked inside Node.js scripts or tooling where startup time matters.
<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.
1nvim/
2├── init.lua Entry point — options, loads bindings & plugins
3├── lua/
4│ ├── bindings/
5│ │ ├── mappings.lua Key mappings
6│ │ └── autocmd.lua Autocommands
7│ ├── core/
8│ │ └── large-files.lua Large file detection & feature toggling
9│ ├── plugins/
10│ │ ├── init.lua Plugin list (lazy.nvim)
11│ │ ├── lspconfig.lua LSP server configs
12│ │ ├── conform.lua Format-on-save setup
13│ │ └── ...
14│ ├── shared_ftplugins/
15│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
16│ └── utils/
17│ ├── large-file-check.lua
18│ └── wildignores.lua
19└── ftplugin/
20 ├── typescript.lua
21 ├── javascript.lua
22 ├── typescriptreact.lua
23 ├── javascriptreact.lua
24 ├── md.lua
25 ├── python.lua
26 └── java.lua<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.
Config at kitty/kitty.conf. Kitty is the primary terminal — configured for a clean, distraction-free experience with the full Catppuccin Frappé color scheme.
JetBrainsMono Nerd Font Mono, 13ptthemes/frappe.conf)150c × 50cblockmacos_option_as_alt yesSwitching themes: All four Catppuccin flavors are in kitty/themes/ — change the include line to latte.conf, macchiato.conf, or mocha.conf to switch.
Config at configs/.tmux.conf (symlinked to ~/.tmux.conf). Uses TPM for plugin management with Catppuccin-matching status bar colors.
C-a10000prefix + h/j/k/l (vim-style)prefix + i/u (next/prev), prefix + p (last)tmux-resurrecttmux-yankConfig at kitty/kitty.conf. Kitty is the primary terminal — configured for a clean, distraction-free experience with the full Catppuccin Frappé color scheme.
JetBrainsMono Nerd Font Mono, 13ptthemes/frappe.conf)150c × 50cblockmacos_option_as_alt yesSwitching themes: All four Catppuccin flavors are in kitty/themes/ — change the include line to latte.conf, macchiato.conf, or mocha.conf to switch.
Config at configs/.tmux.conf (symlinked to ~/.tmux.conf). Uses TPM for plugin management with Catppuccin-matching status bar colors.
C-a10000prefix + h/j/k/l (vim-style)prefix + i/u (next/prev), prefix + p (last)tmux-resurrecttmux-yankPersonal and work profiles with separate SSH keys using includeIf and SSH host aliases
All scripts in bin/ are on PATH and share a common utility library at bin/utils.sh.
wireless-adb <ip>adb-install <apk>adb-reverse <port>adb-uninstall <package>kill-port <port>setup-ssh-agentpwdcreinstall-claudereinstall-gitsyThe assets/ directory contains static resources:
screenshot.pngcatppuccin/JetBrainsMonoPatched.zipAuthor: Santhosh Siva
GitHub: https://github.com/san-siva
A comprehensive macOS development environment managed as a git repository cloned directly to ~/.config. Because all XDG-compliant tools look in ~/.config by default, every config file is automatically in the right place with no extra symlinking needed.
The setup includes a full Neovim IDE configuration, Kitty terminal, Zsh shell config, global Git settings, ESLint / Prettier / TypeScript configs, and a collection of utility shell scripts for daily development.
Theme: The entire environment uses the Catppuccin Frappé color palette — Neovim, Kitty, and all terminal tools are configured to match.
All configuration lives under ~/.config:
nvim/kitty/fish/configs/.zshrc, .gitconfig, .tmux.conf, etc.)bin/android/, dev/, utils.sh)git/assets/XDG compliant: Cloning to ~/.config means tools like Neovim, Kitty, Fish, and gh pick up their configs automatically without any manual linking.
neovim 0.10+node 18+ / nvmgitkittyzshbrewJetBrainsMono Nerd FontClone the repository directly to ~/.config:
# Clone directly to ~/.config (XDG base dir)
git clone https://github.com/san-siva/dotfiles ~/.config
# If ~/.config already exists
cd ~/.config
git init
git remote add origin https://github.com/san-siva/dotfiles
git pull origin mainThree setup scripts handle the full environment bootstrap. Run them in order, or use setup-environment to run all three at once.
The top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
1~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
Installs all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
Creates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
1# Clone directly to ~/.config (XDG base dir)
2git clone https://github.com/san-siva/dotfiles ~/.config
3
4# If ~/.config already exists
5cd ~/.config
6git init
7git remote add origin https://github.com/san-siva/dotfiles
8git pull origin mainThe top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
1~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
1~/.config/bin/dev/setup/setup-environmentInstalls all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
1~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
1~/.config/bin/dev/setup/install-global-depsCreates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
1~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
1~/.config/bin/dev/setup/link-dotfilesA full IDE experience built in Lua using lazy.nvim. Entry point is nvim/init.lua; leader key is ,.
nvim/
├── init.lua Entry point — options, loads bindings & plugins
├── lua/
│ ├── bindings/
│ │ ├── mappings.lua Key mappings
│ │ └── autocmd.lua Autocommands
│ ├── core/
│ │ └── large-files.lua Large file detection & feature toggling
│ ├── plugins/
│ │ ├── init.lua Plugin list (lazy.nvim)
│ │ ├── lspconfig.lua LSP server configs
│ │ ├── conform.lua Format-on-save setup
│ │ └── ...
│ ├── shared_ftplugins/
│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
│ └── utils/
│ ├── large-file-check.lua
│ └── wildignores.lua
└── ftplugin/
├── typescript.lua
├── javascript.lua
├── typescriptreact.lua
├── javascriptreact.lua
├── md.lua
├── python.lua
└── java.luaSet NVIM_NPM=1 to open Neovim with all plugins disabled — useful when invoked inside Node.js scripts or tooling where startup time matters.
<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.
1nvim/
2├── init.lua Entry point — options, loads bindings & plugins
3├── lua/
4│ ├── bindings/
5│ │ ├── mappings.lua Key mappings
6│ │ └── autocmd.lua Autocommands
7│ ├── core/
8│ │ └── large-files.lua Large file detection & feature toggling
9│ ├── plugins/
10│ │ ├── init.lua Plugin list (lazy.nvim)
11│ │ ├── lspconfig.lua LSP server configs
12│ │ ├── conform.lua Format-on-save setup
13│ │ └── ...
14│ ├── shared_ftplugins/
15│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
16│ └── utils/
17│ ├── large-file-check.lua
18│ └── wildignores.lua
19└── ftplugin/
20 ├── typescript.lua
21 ├── javascript.lua
22 ├── typescriptreact.lua
23 ├── javascriptreact.lua
24 ├── md.lua
25 ├── python.lua
26 └── java.lua<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.
Config at kitty/kitty.conf. Kitty is the primary terminal — configured for a clean, distraction-free experience with the full Catppuccin Frappé color scheme.
JetBrainsMono Nerd Font Mono, 13ptthemes/frappe.conf)150c × 50cblockmacos_option_as_alt yesSwitching themes: All four Catppuccin flavors are in kitty/themes/ — change the include line to latte.conf, macchiato.conf, or mocha.conf to switch.
Config at configs/.tmux.conf (symlinked to ~/.tmux.conf). Uses TPM for plugin management with Catppuccin-matching status bar colors.
C-a10000prefix + h/j/k/l (vim-style)prefix + i/u (next/prev), prefix + p (last)tmux-resurrecttmux-yankConfig at kitty/kitty.conf. Kitty is the primary terminal — configured for a clean, distraction-free experience with the full Catppuccin Frappé color scheme.
JetBrainsMono Nerd Font Mono, 13ptthemes/frappe.conf)150c × 50cblockmacos_option_as_alt yesSwitching themes: All four Catppuccin flavors are in kitty/themes/ — change the include line to latte.conf, macchiato.conf, or mocha.conf to switch.
Config at configs/.tmux.conf (symlinked to ~/.tmux.conf). Uses TPM for plugin management with Catppuccin-matching status bar colors.
C-a10000prefix + h/j/k/l (vim-style)prefix + i/u (next/prev), prefix + p (last)tmux-resurrecttmux-yankPersonal and work profiles with separate SSH keys using includeIf and SSH host aliases
All scripts in bin/ are on PATH and share a common utility library at bin/utils.sh.
wireless-adb <ip>adb-install <apk>adb-reverse <port>adb-uninstall <package>kill-port <port>setup-ssh-agentpwdcreinstall-claudereinstall-gitsyThe assets/ directory contains static resources:
screenshot.pngcatppuccin/JetBrainsMonoPatched.zipAuthor: Santhosh Siva
GitHub: https://github.com/san-siva
1# Clone directly to ~/.config (XDG base dir)
2git clone https://github.com/san-siva/dotfiles ~/.config
3
4# If ~/.config already exists
5cd ~/.config
6git init
7git remote add origin https://github.com/san-siva/dotfiles
8git pull origin mainThe top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
1~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
Installs all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
1~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
1~/.config/bin/dev/setup/install-global-depsCreates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
1~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
1~/.config/bin/dev/setup/link-dotfiles1nvim/
2├── init.lua Entry point — options, loads bindings & plugins
3├── lua/
4│ ├── bindings/
5│ │ ├── mappings.lua Key mappings
6│ │ └── autocmd.lua Autocommands
7│ ├── core/
8│ │ └── large-files.lua Large file detection & feature toggling
9│ ├── plugins/
10│ │ ├── init.lua Plugin list (lazy.nvim)
11│ │ ├── lspconfig.lua LSP server configs
12│ │ ├── conform.lua Format-on-save setup
13│ │ └── ...
14│ ├── shared_ftplugins/
15│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
16│ └── utils/
17│ ├── large-file-check.lua
18│ └── wildignores.lua
19└── ftplugin/
20 ├── typescript.lua
21 ├── javascript.lua
22 ├── typescriptreact.lua
23 ├── javascriptreact.lua
24 ├── md.lua
25 ├── python.lua
26 └── java.lua<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.
1# Clone directly to ~/.config (XDG base dir)
2git clone https://github.com/san-siva/dotfiles ~/.config
3
4# If ~/.config already exists
5cd ~/.config
6git init
7git remote add origin https://github.com/san-siva/dotfiles
8git pull origin mainThe top-level bootstrapper. Installs all system tools via Homebrew, then delegates to install-global-deps and link-dotfiles.
1~/.config/bin/dev/setup/setup-environmentpython3, node (via nvm), ruby, go, lua, rust
openjdk, openjdk@21, ant, maven, jdtls, google-java-format
neovim, kitty, tmux + TPM
oh-my-zsh, powerlevel10k, zsh-history-substring-search
ripgrep, fzf, fd, zoxide, jq, yq, gh, fish, deno, wget, tree, fastfetch
black (Python), sqlfluff, shfmt (via Go), stylua (via Cargo)
Installs all global npm packages, symlinks ESLint configs, and enables Corepack. Safe to re-run.
1~/.config/bin/dev/setup/install-global-depseslint, eslint_d, jiti, @eslint/js, @eslint/eslintrc, @eslint/compat
eslint-plugin-react, -react-hooks, -jest, -import, -redux-saga, -unicorn, simple-import-sort, and more
typescript, typescript-eslint, @typescript-eslint/eslint-plugin, @typescript-eslint/parser
prettier, eslint-config-prettier
jest, markdownlint-cli2
@san-siva/gitsy, @anthropic-ai/claude-code, local-ssl-proxy, neovim (npm provider)
Symlinks eslint.config.ts and eslint-utilities.ts into the npm global prefix
1~/.config/bin/dev/setup/install-global-depsCreates symlinks from ~/.config/configs/ into the home directory. Removes any existing file or broken symlink at each target before linking.
1~/.config/bin/dev/setup/link-dotfilesconfigs/.tmux.conf~/.tmux.confconfigs/.prettierrc.json~/.prettierrc.jsonconfigs/.eslintrc.json~/.eslintrc.jsonconfigs/.p10k.zsh~/.p10k.zshconfigs/.gitconfig~/.gitconfigconfigs/.gitconfig__wrk~/.gitconfig__wrkconfigs/ssh_config~/.ssh/configconfigs/eclipse-java-google-style.xml~/.local/share/eclipse/configs/lombok.jar~/.local/share/eclipse/Note: Existing files at the target paths will be removed before linking. Back up any local changes first.
1~/.config/bin/dev/setup/link-dotfiles1nvim/
2├── init.lua Entry point — options, loads bindings & plugins
3├── lua/
4│ ├── bindings/
5│ │ ├── mappings.lua Key mappings
6│ │ └── autocmd.lua Autocommands
7│ ├── core/
8│ │ └── large-files.lua Large file detection & feature toggling
9│ ├── plugins/
10│ │ ├── init.lua Plugin list (lazy.nvim)
11│ │ ├── lspconfig.lua LSP server configs
12│ │ ├── conform.lua Format-on-save setup
13│ │ └── ...
14│ ├── shared_ftplugins/
15│ │ └── javascript.lua Shared JS/TS ftplugin (reads prettier tabWidth)
16│ └── utils/
17│ ├── large-file-check.lua
18│ └── wildignores.lua
19└── ftplugin/
20 ├── typescript.lua
21 ├── javascript.lua
22 ├── typescriptreact.lua
23 ├── javascriptreact.lua
24 ├── md.lua
25 ├── python.lua
26 └── java.lua<C-c><Esc><leader>tl / <leader>th<leader>tL / <leader>tH<leader>1–9<leader>bb<leader>p<leader>P<leader>l<leader>e / <leader>E[e / ]e<leader>N / <leader>n<leader>S<leader>M<leader>ff<leader>fg<leader>fb<leader>fd<leader>tt<leader>gs<leader>gc<leader>gh / <leader>gl<leader>cJ / <leader>cK<C-o><C-y><C-r>TextYankPostBufReadPreBufReadPostBufWinEnterBufReadPre / BufNewFilecatppuccin/nvimnvim-treesitternvim-lspconfig + masonconform.nvimnvim-cmp + luasniptelescope.nvimnvim-tree.luagitsigns.nvimvim-fugitivesupermaven-nvimnvim-ufolualine.nvimindent-blankline.nvimnvim-colorizer.luamarkdown-preview.nvimnvim-jdtlstodo-comments.nvimComment.nvimfidget.nvimts_lsprettiereslintgoplsgoimports + gofmtbasedpyrightisort + blacklua_lsstyluabashlsshfmttailwindcssnvim-jdtlsgoogle-java-formatprettiersqlfmtxmllintyamllintMonorepo TypeScript: ts_ls walks up the directory tree to find the topmost directory containing both tsconfig.json and node_modules — works correctly in monorepos without per-project config.