Personal dotfiles configuration with support for Bash and Zsh on macOS and Linux.
Automate your development environment setup with a single command.
Clone the repository and run the setup:
git clone <repository-url> dotfiles
cd dotfiles
./dotfiles applyThat's it! This will:
- ✅ Configure your operating system (macOS or Linux)
- ✅ Install all packages and applications
- ✅ Copy and configure all dotfiles
Available commands:
./dotfiles apply- Run everything (recommended for first-time setup)./dotfiles apply:config- Configure OS settings only./dotfiles apply:install- Install packages only./dotfiles apply:files- Copy dotfiles only./dotfiles apply:agents- Link the global AI agent skills/instructions only
In-depth guides for the main components live in docs/:
- Neovim — single-file
init.lua, keymaps, autocmds, extension path - Zsh — plugin loading, completions, directory stack, key bindings, prompt
- Zellij — config options, the
mocha-blacktheme, modal keybindings,zjhelper - Git — how
.gitconfigis assembled (base + gui/nogui), aliases, SSH signing - Secrets & 1Password — SSH agent integration, commit signing flow, troubleshooting
- Hammerspoon — macOS-only window management with
hs.gridand auto-reload - Utilities — every custom script in
~/.bin/plus the modern CLI toolset - AI Agents — global skill collection, project templates, symlink targets for Claude Code/Codex/Antigravity
For development tasks (linting, testing, debugging), install mise:
# Install mise
# macOS: brew install mise
# Linux: curl https://mise.run | sh
# Development commands
mise run lint # Lint and syntax-check scripts
mise run test # Run tests on Linux
mise run debug:linux:gui # Debug environment with GUI (VNC)
mise run debug:linux:nogui # Debug environment without GUI- macOS: 10.15 (Catalina) or later
- Linux: Ubuntu 20.04+ or Debian 10+
- Internet connection for package installation
- Administrator/sudo access for package installation
- Git - Should be pre-installed on most systems
- curl - Usually pre-installed, required for downloads
- bash - Version 4.1+ recommended (installed automatically on macOS via Homebrew)
- mise (optional) - Required only for development tasks (
lint,test,debug)- Installation: mise.jdx.dev/getting-started.html
- 1Password account - Required for SSH key management (auth + commit signing)
All installation commands use the ./dotfiles script directly (no mise required):
| Command | Description |
|---|---|
./dotfiles apply |
Complete setup: config + install + files + agents |
./dotfiles apply:config |
Configure OS settings (macOS/Linux) |
./dotfiles apply:install |
Install packages and applications |
./dotfiles apply:files |
Copy dotfiles to home directory |
./dotfiles apply:agents |
Symlink global AI agent skills (Claude Code, Codex, agents.md, Antigravity) and instructions |
These commands require mise to be installed:
| Command | Description |
|---|---|
mise run lint |
Lint and syntax-check all bash scripts |
mise run test |
Run all tests (executes test:linux) |
mise run test:linux |
Test scripts on Linux (Docker) |
mise run debug:linux:gui |
Interactive debug: Ubuntu with GUI (VNC) |
mise run debug:linux:nogui |
Interactive debug: Debian slim without GUI |
mise run ansible |
Provision the home machines (Mac Mini, Home Assistant) (ansible/) |
- Zsh as default login shell (configured automatically via
chsh) - Bash also fully supported, with shared configurations
- OS-specific configurations (
-macosand-linuxvariants) - Zsh plugins auto-loaded: zsh-autosuggestions (Fish-like inline suggestions) and zsh-syntax-highlighting (live command coloring)
- Personal completions in
home/.zsh/completions/and aliases inhome/.zsh/aliases.zsh - Private configuration files support
- macOS - Full support with Homebrew integration
- Linux - Ubuntu and Debian support
- Automatic OS detection and configuration
- Git - Configured with SSH-key signing for commits/tags and delta pager
- 1Password - SSH agent for both authentication and git commit signing
- Editors - Neovim is the official terminal editor (minimal
init.luain~/.config/nvim/); Sublime Text used on GUI environments
- Rust utilities: dust, procs, bottom, ouch, tealdeer, hyperfine, gitui
- Text processing: bat, ripgrep, delta, sd
- System tools: exa, fd, tree, htop
- zsh (default login shell) + zsh-autosuggestions + zsh-syntax-highlighting
- bash (updated via Homebrew on macOS, used by dotfiles scripts)
- bash-completion - Programmable completion
- neovim - Hyperextensible Vim-based editor (set as
$EDITOR) - zellij - Terminal multiplexer (with
zjhelper and Catppuccin Mocha theme) - starship - Cross-shell prompt (Catppuccin Mocha colors)
- git + hub - Version control with GitHub integration
- openssl - Encryption library
- bat - Modern
catwith syntax highlighting - ripgrep (rg) - Fast text search
- delta - Beautiful
git diffviewer - sd - Modern
sedreplacement
- dust - Intuitive disk usage analyzer
- procs - Modern process viewer
- bottom (btm) - System monitor
- ouch - Universal archive extractor
- tealdeer (tldr) - Simplified man pages
- hyperfine - Command benchmarking
- gitui - Terminal UI for Git
- htop (Linux) - Interactive process viewer
- tree - Directory tree viewer
- exa - Modern
lsreplacement (aliased asl/llin zsh) - fd - Fast
findalternative
- docker / Docker CE - Container platform
- docker-compose - Multi-container orchestration
- awscli - AWS command-line interface
- rustup - Rust toolchain
- node - Node.js runtime
- OpenJDK - Java Development Kit
- Android SDK - Android development tools
- Antigravity CLI (
agy) - Google's terminal AI agent, installed in all environments (macOS via Homebrew cask, Linux via the official installer into~/.local/bin) - Antigravity IDE CLI (
antigravity-ide/agy-ide) - command-line launcher for the Antigravity IDE (open files/folders from the terminal, like VS Code'scode), linked in GUI environments (macOS into the Homebrew prefix, Linux into/usr/local/bin)
- 1Password + CLI - Password manager
- Antigravity - Google AI agent orchestration platform
- Antigravity CLI (
agy) - Terminal interface for Antigravity agents - Antigravity IDE - Google AI coding agent IDE (CLI launcher
antigravity-ide/agy-idelinked into the Homebrew prefix) - Cursor - AI-powered code editor
- Docker Desktop - Container platform
- Droplr - File sharing and screenshots
- Firefox - Web browser
- Google Chrome - Web browser
- Google Drive - Cloud storage
- Hammerspoon - Automation tool
- IconJar - Icon management
- IntelliJ IDEA - Java IDE
- iTerm2 - Terminal emulator
- Sublime Text + Sublime Merge - Editor and Git client
- TablePlus - Database management
- The Unarchiver - Archive extractor
- Transmit - FTP/SFTP client
- Visual Studio Code - Code editor
- VLC - Media player
- Amphetamine - Keep Mac awake
- Audio Lock - Audio device management
- Brother P Touch Editor - Label printer software
- Capto - Screen recording
- DaisyDisk - Disk space analyzer
- Dato - Menu bar calendar
- HTTPBot - HTTP client and API testing
- KeepSolid VPN - VPN client
- Microsoft Remote Desktop - Remote desktop client
- Monodraw - ASCII art editor
- Pastel - Color picker
- Pixelmator Pro - Image editor
- Slack - Team communication
- Spark Mail - Email client
- TextSniper OCR - OCR tool
- Typeface 3 - Font manager
- WhatsApp Desktop - WhatsApp client
- Xcode - Apple development IDE
- xScope 4 - Design and development tools
- Yubico Authenticator - Two-factor authentication
- 1Password (GUI) - Password manager
- Antigravity - Google AI agent orchestration platform (official tarball)
- Antigravity IDE - Google AI coding agent IDE (official tarball, CLI launcher
antigravity-ide/agy-idein/usr/local/bin) - Caffeine Indicator - Keep system awake
- Chrome (Google Chrome) - Web browser
- Insomnia - API client and testing
- IntelliJ IDEA Ultimate - Java IDE
- Slack (via Flatpak) - Team communication
- Sublime Text + Sublime Merge - Editor and Git client
- Visual Studio Code - Code editor
- VLC - Media player
- PlatformIO - Embedded development
- QEMU/KVM - Virtualization with GUI tools (virt-manager, virt-viewer)
- GNOME Extensions (Ubuntu/GNOME only) - Shell extensions
- GNOME Tweaks (Ubuntu/GNOME only) - GNOME customization tool
- Shared:
home/.shared_shell_config(loaded by both shells) - Bash:
home/.bash_profile,home/.bash_functions - Zsh:
home/.zshrc,home/.zsh_functions - OS-specific: Automatically selected based on OS (
-macosor-linux)
The .gitconfig is automatically assembled based on your environment:
- Base: Common settings (SSH-key commit signing, aliases, GitHub-over-SSH)
- GUI mode (macOS or Linux with GUI):
- Sublime Merge for merge conflicts
- Sublime Text as editor
- Delta pager for diffs
- CLI mode (Linux without GUI):
- Neovim as editor
- Delta pager for diffs
- zellij - Terminal multiplexer configuration (
~/.config/zellij/config.kdl) - SSH - OS-specific SSH config; 1Password agent socket exported via
$SSH_AUTH_SOCK - Commit signing - SSH-key based via 1Password agent (see docs/secrets.md)
dotfiles/
├── .config/
│ └── mise/
│ └── tasks/ # Development tasks (lint, test, debug)
│ ├── test/ # Test tasks
│ ├── debug/ # Debug environments
│ └── lint # Linting task
├── bin/ # Installation scripts
│ ├── apply-config-macos # macOS system configuration
│ ├── apply-config-linux # Linux system configuration
│ ├── apply-install-macos # macOS package installation
│ ├── apply-install-linux # Linux package installation
│ ├── apply-files # Copy dotfiles to home
│ └── validate-url # URL validation utility
├── home/ # Configuration files (→ ~/)
│ ├── .bin/ # Custom scripts
│ └── .* # Dotfiles (bash, zsh, git, zellij, etc.)
├── macos/ # macOS-specific configs
│ └── DefaultKeyBinding.dict
├── mise.toml # mise configuration
└── dotfiles # Main script (apply commands)
To update your dotfiles from the repository:
git pull origin master # or 'main'
./dotfiles applyThis will:
- Pull the latest changes
- Reapply all configurations, packages, and dotfiles
- Show instructions to reload your shell if needed
After updating, reload your shell:
source ~/.bash_profile # for Bash
source ~/.zshrc # for Zsh- Edit files in the
home/directory - Run
./dotfiles apply:filesto apply changes - Reload your shell:
source ~/.bash_profileorsource ~/.zshrc
Private files (not versioned) are automatically loaded if they exist:
~/.bash_private~/.zshrc_private~/.shared_shell_config_private
Add your personal configurations here without committing them to the repository.
Symptoms: Changes to dotfiles aren't taking effect, or files aren't found.
Solution:
./dotfiles apply:install # Ensure packages are installed
./dotfiles apply:files # Re-copy dotfiles
source ~/.bash_profile # Reload shell (Bash)
# or
source ~/.zshrc # Reload shell (Zsh)Symptoms: Commands like bat, rg, eza, etc. are not recognized.
Solutions:
- Verify packages are installed:
./dotfiles apply:install - Check if
~/.shared_shell_configis loaded in your shell - Verify PATH includes
~/.local/bin(Linux) or Homebrew paths (macOS) - Reload shell:
source ~/.bash_profileorsource ~/.zshrc - Check if the package manager (Homebrew/apt) is working correctly
Symptoms: git commit fails with gpg failed to sign the data, or commits show as unverified on GitHub.
Setup (one-time per machine):
Commit signing uses the SSH key stored in 1Password, via the 1Password SSH
agent. ./dotfiles apply:files fetches the public key from 1Password and
writes it to ~/.ssh/id_signing.pub, which ~/.gitconfig references.
op signin # Authenticate 1Password CLI
./dotfiles apply:files # Will fetch the SSH pubkey and write ~/.ssh/id_signing.pubTroubleshooting checklist:
-
1Password CLI authenticated:
op account list op signin # if the above is empty -
SSH signing key file exists:
cat ~/.ssh/id_signing.pub # Should start with `ssh-ed25519 ...` or `ssh-rsa ...`
If missing or empty, run
./dotfiles apply:filesafterop signin. -
Git is configured for SSH signing:
git config --global gpg.format # should print: ssh git config --global user.signingkey # should print: ~/.ssh/id_signing.pub git config --global commit.gpgsign # should print: true
-
1Password SSH agent socket is reachable:
echo $SSH_AUTH_SOCK ssh-add -L # Should list the key from 1Password
-
Test signing:
echo "test" | ssh-keygen -Y sign -n git -f ~/.ssh/id_signing.pub # Should output an SSH signature, prompting for approval in 1Password
In 1Password Desktop, also enable: Settings → Developer → Use the SSH agent and Sign Git commits with 1Password (the latter is optional — our setup works without it because we configure git ourselves).
Symptoms: SSH connections failing, keys not found, or 1Password SSH agent not working.
Solutions:
-
Verify 1Password SSH agent is running:
ls -la ~/.1password/agent.sock -
Check SSH config:
cat ~/.ssh/config -
Verify SSH keys in 1Password:
op item list --categories "Secure Note" | grep -i ssh
-
Re-apply SSH configuration:
./dotfiles apply:files
Symptoms: Wrong editor, merge tool, or signing not working.
Solutions:
-
Check current Git configuration:
git config --global --list
-
Verify GUI detection (should match your environment):
echo $DISPLAY # Linux GUI echo $WAYLAND_DISPLAY # Linux Wayland
-
Re-apply Git configuration:
./dotfiles apply:files
Symptoms: Packages fail to install, or installation is incomplete.
Solutions:
macOS:
# Update Homebrew
brew update
# Fix Homebrew issues
brew doctor
# Re-run installation
./dotfiles apply:installLinux:
# Update package lists
sudo apt update
# Fix broken packages
sudo apt --fix-broken install
# Re-run installation
./dotfiles apply:installUse the debug environments to troubleshoot issues in isolated containers:
# Ubuntu with GUI (VNC access)
mise run debug:linux:gui
# Debian slim without GUI
mise run debug:linux:noguiThe debug environments provide:
- Interactive bash shell with pre-configured environment
- VNC access (GUI mode) for visual debugging
- Automatic cleanup on exit
- Full access to test installation scripts
VNC Connection (GUI mode):
After starting debug:linux:gui, the script will display connection instructions.
Typically: vncviewer localhost:<port> with password password.
Run tests to verify everything works:
mise run test # Run all tests
mise run test:linux # Test on Linux (Docker)Tests verify:
- Script syntax and execution
- Dotfiles are copied correctly
- Git configuration (GUI/nogui detection)
- Shell configuration validity
This project is licensed under the WTFPL (Do What The Fuck You Want To Public License).
See LICENSE file for details.
Personal project. Feel free to use as reference.
Important: This is a personal dotfiles repository. I do not intend to transform this into a project for direct use by other people. Instead, this is meant to be forked and adapted to create your own personalized dotfiles setup.
Recommended approach:
- Fork this repository and start your own dotfiles project from here
- Adapt and customize the configuration to your needs
- Use as reference for your own setup
However, if you still want to contribute (e.g., report bugs, suggest improvements, or share ideas), feel free to:
- Report issues or suggest improvements
- Share ideas or best practices
- Submit pull requests (though they may not be merged if they're too personal/specific)