Personal macOS development environment configuration featuring Neovim with AI assistance, Fish shell, and modern terminal tooling.
# Clone repository
git clone <your-repo-url> ~/.dotfiles
cd ~/.dotfiles
# Install Homebrew packages
brew bundle install
# Deploy configurations using GNU Stow
stow .
# Install Neovim plugins
nvim --headless "+Lazy! sync" +qa
# Setup Fish shell credentials (optional)
cp .config/fish/credentials.fish.template .config/fish/credentials.fish
# Edit credentials.fish with your API keys and tokens.
├── .config/
│ ├── nvim/ # Neovim configuration (LazyVim)
│ ├── fish/ # Fish shell with custom functions
│ ├── tmux/ # Tmux multiplexer configuration
│ ├── ghostty/ # Ghostty terminal emulator
│ ├── starship/ # Starship prompt configuration
│ ├── lazygit/ # Lazygit configuration
│ ├── k9s/ # Kubernetes TUI configuration
│ └── opencode/ # OpenCode AI editor configuration
├── archive/ # Old/backup configurations
├── Brewfile # Homebrew package list
├── Dockerfile # Development container image
├── install.fish # Automated installation script
├── template_mcp.json # MCP server configuration template
└── README.md # This file
- Claude Code: Anthropic's CLI (
calias) - OpenCode: AI-powered code editor with LM Studio integration
- MCP Servers: 6 configured servers (Jam, Tmux, Browser, GCP, AWS, Serena)
- Neovim: LazyVim with AI assistance and comprehensive plugin ecosystem
- Framework: LazyVim
- AI Assistance: Avante.nvim (OpenAI, Claude, Moonshot)
- MCP Integration: Model Context Protocol support
- Language Support: Go, Python, Terraform, Docker, Kubernetes, Helm
- Formatters: Black, Ruff, goimports, gofumpt, prettier, stylua
- LSP: Comprehensive language server support via Mason
- UI: Snacks.nvim for pickers, explorer, notifications
- Themes: OneDark, Catppuccin, Kanagawa, Dracula, Sonokai, Cyberdream
- Shell: Fish with 22+ custom functions
- Prompt: Starship (configured for cloud/dev workflows)
- Terminal: Ghostty with Dark+ theme
- Multiplexer: Tmux with Catppuccin theme
- Kubernetes: kubectl, k9s, helm, helmfile, kubeshark
- Cloud: gcloud, azure-cli, doctl
- IaC: Terraform, Pulumi
- Containers: Docker, lazydocker
- CI/CD: ArgoCD, Woodpecker
The repository includes MCP server configurations for AI-enhanced development:
Configured Servers (see template_mcp.json):
- Jam: Browser automation via HTTP
- Tmux: Terminal session management with Fish shell
- BrowserMCP: Browser control and automation
- GCP: Google Cloud Platform operations
- AWS: AWS infrastructure management (awslabs.core-mcp-server)
- Serena: Additional AI capabilities via Oraios Serena
Usage:
# Copy template for Claude Code
cp template_mcp.json ~/.config/claude-code/mcp.json
# Or use directly with AI tools that support MCPOpenCode is configured with LM Studio for local LLM inference:
Features:
- Local LM Studio integration (http://127.0.0.1:1234/v1)
- Environment protection middleware
- OpenAI-compatible API
- MCP Integration: Tmux and Serena servers
Configuration: .config/opencode/opencode.json
Quick reference for common aliases:
# AI Tools
c # Claude Code CLI
o # OpenCode editor
# Development
n, vim, gvim # Neovim shortcuts
dotfile # Edit dotfiles repository
dotconfig # Edit .config directory
ssh-config # Edit SSH configuration
# Kubernetes
k # kubectl
h # helm
k9s-logs # View k9s screen dumps
# Git
gitlog # Pretty git log graph
lzgit # Lazygit TUI
# Python
p, python # Python 3.12
penv # Create venv
venv # Activate venv
pip-freeze # Export requirements.txt
# Docker
dock # docker
dcompose # docker-compose
lzdoc # lazydocker TUI
kali # Access Kali Linux container
# Terraform
tf # terraform
# Cloud
g # gcloud
gs # gsutil
# Tmux
t # tmux
ta # tmux attach -t
tn # tmux new -s
mux # tmuxinator
# Utilities
fcat # Fuzzy find files with bat preview
brew-export # Export Brewfile with descriptions20+ Custom Functions:
Docker Utilities:
buildx- Build multi-platform Docker imagesbuildx-push- Build and push to registry
Security & Encoding:
gen-passwd- Generate secure passwordssha256- Calculate SHA-256 hashde64- Decode base64 strings
General Utilities:
tarx- Extract tar.gz archivesenvsource- Load .env file variablesh-dry- Helm dry-run helpernv- Navigate and open with Neovimgit-test- Git testing utility
Key Features:
- Prefix: Alt/Option + Space (macOS optimized)
- Theme: Catppuccin Mocha
- Navigation: Vim-style (hjkl) with vim-tmux-navigator
- Plugins:
- tmux-sensible (sensible defaults)
- vim-tmux-navigator (seamless Vim/Tmux navigation)
- tmux-resurrect (session save/restore)
- tmux-menus (interactive menus)
- Copy Mode: Vi-style with system clipboard integration (pbcopy)
- Shell: Fish as default
- Mouse: Enabled for pane selection, resizing, scrolling
-
Copy the template:
cp .config/fish/credentials.fish.template .config/fish/credentials.fish
-
Edit and add your secrets:
# API Keys set -gx OPENAI_API_KEY "your_openai_key" set -gx ANTHROPIC_API_KEY "your_anthropic_key" # Cloud credentials set -gx GITHUB_TOKEN "your_token" set -gx GOOGLE_APPLICATION_CREDENTIALS "/path/to/credentials.json"
-
The file is gitignored and will not be committed.
Pre-commit hooks are configured to prevent credential leaks:
- Gitleaks: Scans for hardcoded secrets, API keys, tokens
- Custom checks: Blocks
credentials.fish,.envfiles (without.template) - File size check: Prevents files >1MB (excludes lazy-lock.json)
- Syntax validation: YAML, JSON
- Private key detection: SSH/PGP keys
- Code quality: Trailing whitespace, EOF newlines, mixed line endings
Setup pre-commit (one-time):
pre-commit installThe hooks will automatically run before each commit and reject commits if:
- Credentials or API keys are detected
credentials.fishor.envfiles are staged (without.template)- Private keys are found
- Large files are added (>1MB)
- YAML/JSON syntax is invalid
The Brewfile includes:
Cloud & Infrastructure: k9s, helm, terraform, pulumi, argocd, kubectl Languages: go, python, node, rust Utilities: fzf, ripgrep, bat, lazygit, lazydocker Cloud CLIs: gcloud, azure-cli, doctl Security: gitleaks, age Terminals: ghostty
The included Dockerfile provides a full dotfiles-compatible environment:
- Debian stable-slim base
- Go, Node.js LTS
- Neovim (latest stable, from GitHub releases)
- Starship, FZF, Zoxide, Lazygit, Yazi
- Docker CLI
- Fish + Tmux with all plugins pre-installed
Dotfiles are cloned from GitHub at build time — no local copy needed.
# Default: clones main branch of https://github.com/Herdanis/dotfiles
docker build -t devenv .
# Override branch
docker build --build-arg DOTFILES_BRANCH=feat/something -t devenv .
# Override repo (e.g. a fork)
docker build --build-arg DOTFILES_REPO=https://github.com/fork/dotfiles.git -t devenv .# Interactive shell with current directory mounted as /workspace
docker run -it --rm -v $(pwd):/workspace devenv
# Mount Docker socket to use Docker CLI inside the container
docker run -it --rm \
-v $(pwd):/workspace \
-v /var/run/docker.sock:/var/run/docker.sock \
devenv
# Pass environment variables (e.g. API keys)
docker run -it --rm \
-v $(pwd):/workspace \
-e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
devenvAvailable colorschemes (switch with <C-n> for FzfLua picker):
- OneDark (Darker) - Active
- Catppuccin Mocha
- Kanagawa
- Dracula
- Sonokai
- Cyberdream
# Update Homebrew packages
brew bundle install
# Update Neovim plugins
nvim --headless "+Lazy! sync" +qa
# Pull latest dotfiles
git pull origin main
# Re-deploy with Stow (if needed)
cd ~/.dotfiles
stow --restow .
# Update pre-commit hooks
pre-commit autoupdate- Uses GNU Stow for symlink management
- Follows XDG Base Directory specification (
~/.config/) - Credentials are excluded via
.gitignore - Archive directory for old/experimental configs
- Python 3.12 is the default Python version
Feel free to fork and customize for your own use. If you find improvements or bugs, please open an issue or PR.
Personal configuration files - use at your own discretion.