Personal cross-platform (macOS + Linux) configuration and dotfiles management system.
The platform is auto-detected via uname. On macOS packages come from Homebrew
(Brewfile); on Linux (Debian/Ubuntu, tested on WSL2) from apt (packages/apt.txt)
plus a few upstream installers in linux.sh.
git clone <repository-url> ~/.dotfiles
cd ~/.dotfiles
./install.sh # Auto-detects the OS, runs bootstrap if needed, installs everything
# ./install.sh --linux # Force the Linux path (overrides auto-detection)
exec zsh # Reload shell./install.sh # Safe to re-run - updates packages and syncs dotfiles
# Or for quick dotfile-only syncs:
./sync.sh -f # Sync dotfiles without package updates- Zsh with antidote plugin manager
- Starship prompt
- Oh My Zsh plugins (git, brew, extract)
- Enhanced utilities (zsh-autosuggestions, zsh-syntax-highlighting, z)
- Development: helix, vim, git, python, node, docker
- Networking: httpie, nmap, mtr, wrk
- Kubernetes: kubectl, helm, yq
- GUI apps (macOS only): iTerm2, VS Code, Firefox, Obsidian, and more
See Brewfile (macOS) and packages/apt.txt (Linux)
for the complete lists. Tools not in apt (antidote, starship, helix, node, kubectl,
helm, yq) are installed by linux.sh.
Smart Python venv activation:
svenv # Finds and activates venv/.venv/poetry/pipenv in parent directoriesFile sharing:
scpp file.txt # Upload to stkn.org and copy URL to clipboardUtilities:
server 8080 # Start HTTP server on port 8080
tunnel host 3306 3307 # SSH port forwarding
pwgen 20 # Generate 20-character passwordSee .aliases and .functions for all shortcuts.
| Script | Purpose | When to Use |
|---|---|---|
macos-bootstrap.sh |
One-time macOS system setup (Xcode CLI tools, Homebrew) | macOS first installation only (or run automatically by install.sh) |
install.sh |
Full installation - auto-detects OS, runs bootstrap if needed, installs/updates packages, sets zsh as default shell (--linux forces the Linux path) |
First-time setup AND regular updates (safe to re-run) |
linux.sh |
Linux (apt) package install + upstream installers for tools not in apt | Called by install.sh on Linux |
macos.sh |
macOS system defaults (Finder, Dock, trackpad) | Called by install.sh on macOS |
sync.sh |
Sync dotfiles only (supports -f, -d flags) |
Quick dotfile-only syncs or testing changes |
git.sh |
Apply git config settings, prompts for user.name/email if not set | Called by install.sh |
./sync.sh -d # Dry-run: preview changes without syncing
./sync.sh -f # Force: skip confirmation promptdotfiles/
├── git/ # Git-specific config (.gitignore_global, .gitattributes_global)
├── system/ # Shell and app dotfiles (.zshrc, .vimrc, .tmux.conf, etc.)
├── lib/ # Shared helpers (os.sh - OS detection)
├── packages/ # apt.txt - Linux package list
├── *.sh # Setup and maintenance scripts
├── Brewfile # Homebrew package definitions (macOS)
└── CLAUDE.md # AI agent instructions
Files in git/ and system/ are synced to $HOME via rsync.
- Add a package: Edit
Brewfile(macOS) orpackages/apt.txt(Linux) → run./install.sh - Add an alias: Edit
system/.aliases→ run./sync.sh -f→ reload shell - Add a zsh plugin: Edit
system/.zsh_plugins.txt→ run./sync.sh -f→ reload shell - Modify macOS settings: Edit
macos.sh→ run./macos.sh→ restart affected app
- Default editor: helix (
hx) - Default branch:
main - Credentials: macOS keychain on macOS; libsecret or a 1h credential cache on Linux
- Plugin manager: vim-plug
- Theme: Solarized Dark
- Persistent undo, automatic position restore
- Finder: show path bar, status bar, all extensions
- Dock: minimize to application, auto-hide
- Trackpad: tap to click enabled
See macos.sh for all system preferences.
./sync.sh -d # See what would change without applying./install.sh # Syncs dotfiles, updates packages, reconfigures git/vim/macOS- macOS (recent versions), or Linux (Debian/Ubuntu, tested on WSL2)
- macOS: Xcode Command Line Tools (installed by
macos-bootstrap.sh) - Linux:
sudoaccess for apt - Internet connection for initial setup
MIT - See LICENSE file for details.