Development environment for macOS and Linux (Debian/Ubuntu) - starship + catppuccin mocha, modern CLI tools, one-command install with two modes.
starship with the catppuccin powerline preset: git branch and dirty state, node version resolved from .nvmrc by mise, eza tree listing with icons and git status, bat syntax highlighting. Dracula+ in iTerm2.
AstroNvim v6: neo-tree with git status, TypeScript LSP (vtsls) on the statusline, gitsigns change markers, catppuccin - plugin versions pinned by a committed lazy-lock.json.
On a clean machine, one command does everything (Command Line Tools / apt deps, Homebrew, clone, full setup):
curl -fsSL https://raw.githubusercontent.com/ikwach/dotfiles/master/bootstrap.sh | bash -s -- personalMinimal Ubuntu images may not ship curl; wget works the same:
wget -qO- https://raw.githubusercontent.com/ikwach/dotfiles/master/bootstrap.sh | bash -s -- corporateOr clone first and run the installer directly:
git clone https://github.com/ikwach/dotfiles.git ~/workspace/dotfiles
cd ~/workspace/dotfiles
./install.sh personal # everything: core + AI, cloud, media tools
./install.sh corporate # restricted: core CLI tools onlyOptional flags (work with both entry points):
| Flag | Effect |
|---|---|
--with-macos-defaults |
apply the system settings in macos.sh (keyboard repeat, Finder, screenshots folder, tap to click) |
--with-mac-keys |
Linux only: install Toshy for mac-style keyboard shortcuts |
Everything is idempotent - rerun any time. Existing configs are backed up to ~/.dotfiles-backup-<timestamp> before being replaced with symlinks. Any existing zsh history is imported into atuin (only into an empty database, so reruns never duplicate it). Personal mode also installs node (lts) and go via mise, and neovim plugins and language servers are pre-installed at exact lockfile versions, so the first nvim launch is instant. On macOS an iTerm2 dynamic profile named dotfiles appears automatically with Dracula+ colors and the nerd font baked in - select it once as your default profile.
| corporate | personal | |
|---|---|---|
| Shell: zsh + antidote + starship (catppuccin) | ✅ | ✅ |
| CLI: bat, eza, ripgrep, fd, fzf, zoxide, atuin, dust, btop, jq, yq, tealdeer | ✅ | ✅ |
| Git: delta (catppuccin), lazygit, gh | ✅ | ✅ |
| Dev: neovim, mise, tmux, iTerm2, JetBrains Mono Nerd Font | ✅ | ✅ |
| AI: Claude Code, Claude desktop | - | ✅ |
| Cloud: gcloud, cloud-sql-proxy | - | ✅ |
| Media: ffmpeg, yt-dlp, pandoc, rclone | - | ✅ |
| 1Password CLI | - | ✅ |
Git identity is set up at the end of the install: log in to GitHub in the browser (gh auth login, default yes) and your name and email are taken from the account - a hidden email becomes the account's noreply address, and git is wired to push/pull with gh's credentials. Decline the login and the installer falls back to prompting; corporate mode asks for your work email there. Nothing personal is baked into the repo - identity, secrets, and machine-specific config all live in local files (see below).
Packages come from Homebrew on Linux on both OSes, so there is one manifest with identical tool versions and no batcat/fdfind renames. apt is only used to bootstrap Homebrew's build dependencies. iTerm2 and the other casks are macOS-only and get skipped; JetBrains Mono Nerd Font is installed from the nerd-fonts release into ~/.local/share/fonts instead.
Terminal font is set for you. linux-terminal.sh points the terminal at the nerd font over gsettings, covering Ptyxis (the default from Ubuntu 25.10), GNOME Terminal and Console - the counterpart to the iTerm2 dynamic profile on macOS. A font you chose yourself is left alone; force it with DOTFILES_TERMINAL_FONT, which also overrides the font that gets set. Quit the terminal completely afterwards: a running one caches the font list from startup, so a new tab still shows tofu. For colors, Ptyxis ships palettes in its preferences; GNOME Terminal users can use catppuccin/gnome-terminal.
Personal mode installs the cask tools too. Since cask lines are stripped on Linux, linux-extras.sh installs Claude Code (native installer), the gcloud CLI and the 1Password CLI from their official Linux channels, so personal mode is not quietly thinner than on macOS. The Claude desktop app is the one exception - see desktop on Linux.
The install CI workflow runs corporate mode on both Ubuntu and macOS on every PR, plus personal mode on Ubuntu - the only coverage for linux-extras.sh.
bootstrap.sh # greenfield entry point (CLT/apt deps, brew, clone, install)
Brewfile.core # cross-platform packages for both modes
Brewfile.macos # macOS-only: iTerm2, nerd font cask, mas
Brewfile.personal # extras for personal mode
install.sh # installer (brew, symlinks, git identity, secrets, theme caches)
macos.sh # opt-in macOS system defaults (--with-macos-defaults)
linux-terminal.sh # sets the nerd font in Ptyxis/GNOME Terminal/Console
linux-extras.sh # Linux installs for the personal-mode cask tools
iterm2/ # dynamic profile (Dracula+ colors + nerd font, auto-loaded)
zsh/ # .zshrc + antidote plugin list
starship/ # prompt config (catppuccin mocha powerline)
git/ # .gitconfig (identity excluded) + global ignore
tmux/ # tmux config with catppuccin v2
nvim/ # AstroNvim v6 (language packs, catppuccin, pinned lockfile)
bat/ lazygit/ tealdeer/ # per-tool configs
themes/ # vendored catppuccin themes (bat, delta, btop, eza, iterm)
bin/ # gifenc (ffmpeg gif encoder), super-sync (rsync watch)
| File | Purpose |
|---|---|
~/.gitconfig.local |
git name/email - from the GitHub login (or the fallback prompt) |
~/.secrets.env |
API keys, chmod 600, sourced by .zshrc; prefer op read for values |
~/.zshrc.local |
machine-specific shell config |
z <dir> # jump to a directory you've visited (zoxide)
Ctrl+R # fuzzy history search (atuin)
Ctrl+T # fuzzy file picker (fzf)
ll / la / lt # eza listings (long / all / tree)
lg # lazygit
osup # update everything (brew, plus App Store/OS on macOS, apt on Linux)
mise use -g node@lts # runtime versions (replaces nvm/pyenv/rbenv)The CLI toolchain is catppuccin mocha: starship (official catppuccin-powerline preset), bat, fzf, delta, lazygit, eza, tmux, tealdeer. To change flavor: edit palette = in starship/starship.toml and swap the vendored files in themes/ from the corresponding catppuccin repo.
The terminal itself runs Dracula+, and btop uses its bundled dracula theme to match - both pair surprisingly well with the catppuccin prompt, since starship colors are truecolor and independent of the terminal scheme. iTerm2 needs a one-time manual setup (its settings aren't file-based): Settings > Profiles > Colors > Color Presets > Import > themes/iterm/dracula-plus.itermcolors (or catppuccin-mocha.itermcolors for an all-catppuccin look), and Settings > Profiles > Text > Font > JetBrainsMono Nerd Font (needed for the prompt icons).
cd ~/workspace/dotfiles && git pull && ./install.sh <mode>- Neovim is AstroNvim v6 with community packs for TypeScript, Rust, Go, Python, JSON, YAML and Markdown, catppuccin, and
lazy-lock.jsoncommitted so plugin versions are identical on every machine. First launch finishes installing language servers automatically; run:Lazy updateon your own schedule and commit the refreshed lockfile. misereads.nvmrc/.tool-versions/.python-versionautomatically per project.- tmux plugins install on first launch, or
prefix + I(prefix isCtrl+a).

