A comprehensive dotfiles management system using PyInfra for automated setup and configuration of macOS and Arch Linux development environments.
This repository contains dotfiles and configuration management for a complete development environment setup. It automates the installation and configuration of development tools, shell environments, and applications using PyInfra deployment automation.
./bin/update.shThis single command will:
- Install Homebrew (if not present)
- Install rustup (if not present)
- Install uv Python package manager (if not present)
- Run the PyInfra deployment to configure your system
-
/bin/update.sh- Bootstrap script that:- Installs Homebrew package manager
- Installs rustup (Rust toolchain manager)
- Installs uv (fast Python package manager)
- Calls the install script
-
/bin/install.sh- Runs the PyInfra deployment:uv run pyinfra @local configure.py
-
configure.py- PyInfra deployment script that:- Links
.config/directory to~/.config/ - Links
home/directory contents to~/ - Installs and configures all development tools
- Links
.config/- Configuration files that get linked to~/.config/home/- Files that get linked to your home directory (~)bin/- Installation and update scriptsconfigure.py- PyInfra deployment configuration
- Go - Programming language
- Bun - JavaScript runtime
- Rust (via rustup) - Systems programming language
- Fish - Modern shell with autocompletion
- Starship - Cross-shell prompt
- Fisher - Fish plugin manager
- Tmux - Terminal multiplexer
- TPM (Tmux Plugin Manager) - Auto-installed for plugin management
- tmux-fzf - Fuzzy finder for sessions, windows, panes (prefix + Ctrl-f)
- Neovim - Modern Vim-based editor with full configuration
- ripgrep - Fast text search
- fd - Fast file finder
- fzf - Fuzzy finder
- gum - Glamorous shell scripts
- K9s - Kubernetes TUI
- Pulumi - Infrastructure as Code
- GitHub CLI - GitHub command line
- Lazygit - Git TUI
- Lazydocker - Docker TUI
- GnuPG - Encryption and signing
- pinentry-mac - macOS GPG passphrase entry
- Alacritty - GPU-accelerated terminal (built from pinned upstream source on macOS because the Homebrew cask is disabled)
- Slack - Team communication
- Spotify - Music streaming
- Obsidian - Note-taking and knowledge management
- LinearMouse - Mouse customization
- Bitwarden - Password manager
All tools come pre-configured through the linked configuration directories:
- Neovim: Full IDE setup with LSP, plugins, and keybindings
- Fish: Shell configuration with aliases and functions
- Tmux: Terminal multiplexer configuration
- Git: Version control settings
- And more: All configurations are automatically linked and ready to use
This dotfiles system includes several custom utilities for configuration and environment management:
adopt-dot- Interactive tool to adopt existing config files from~or~/.configinto your dotfiles repositoryedit-env- Create and edit environment variable groups in OpenBao KV
Run ./bin/dev-clean for an interactive, size-sorted cleanup list. Go 1.25.5 or newer builds a cached binary on first use.
The launcher works from any directory. ./bin/dev-clean --help lists options without a scan or cleanup.
- Default search roots:
~/reposand this checkout. Add roots with repeatable--root /pathoptions. - Discovery includes registered Git worktrees outside those roots and nested Cargo/JavaScript projects.
- No target starts selected. Space toggles a target;
aselects filtered targets;nclears the selection. /filters; arrows navigate;ppreviews commands;rrefreshes and clears the selection.wshows all scan warnings.- Teal marks focus and selection; amber marks warnings. Red marks destructive actions and confirmation.
- The list aligns size, type, and project columns. Short paths use
~or this checkout's name. - The focused-target panel shows the path and cleanup command.
dopens full details; arrows scroll long paths and commands. - The selection summary combines known logical bytes and a separate count for unknown sizes.
- The scan indicator animates until discovery completes. Cleanup reports the active target and completed count, one target at a time.
- Small panes use a compact layout;
?shows all keys and the full size summary. - If the pane cannot show review text and confirmation controls, cleanup stays blocked until you enlarge it.
- Set
NO_COLORfor plain text; focus and selection retain text markers. - Enter opens the final review. Type
CLEANto execute, or press Escape to return. - Cargo uses
cargo cleanfor each distinct target directory, including shared or external targets shown in the review. - Selected
node_modulesdirectories permit direct deletion. Path checks reject symlink ancestors and protected directories. - Global operations use
pnpm store prune,bun pm cache rm, andgo clean -cache. Go modules remain intact. - Docker removes all stopped containers, unused images, build cache, and unused volumes, including named volumes.
Docker preserves containers that run and their referenced resources. Cleanup can delete local databases and test data.
The review shows the Docker context or
DOCKER_HOST, endpoint, and TLS settings. Docker cleanup requires the exact phraseDELETE DOCKER DATA. Commands retain the initial endpoint selection; a context definition change blocks further cleanup until refresh. - Ctrl+C cancels the active subprocess group. Completed operations have no undo.
Scans run asynchronously and report unavailable tools or daemons as warnings.
Cargo discovery uses offline, locked metadata; unresolved projects produce warnings instead of dependency downloads.
Sizes and recovered-space estimates use logical file bytes, not exact free disk space.
Shared files, hard links, and concurrent writes affect accuracy.
Docker's pre-clean estimate sums the reclaimable categories from docker system df at the pinned destination,
with a 15-second timeout. Shared image layers and build-cache accounting can overlap, so this is approximate,
not a promise of free disk space. If the estimate is unavailable or incomplete, the Docker size stays unknown
and the scan shows a warning. Docker recovery after cleanup still reports an unknown size.
envl- Fish function to load OpenBao environment variables into your shell session- Includes related commands:
envsandenvls - Provides tab completion for environment group names
- Calls
env-selectinternally to fetch and load variables
- Includes related commands:
env-select- Fetch and select environment variable groups from OpenBao KV
These tools use OpenBao OIDC authentication and load secrets from the kv/env namespace.
TPM (Tmux Plugin Manager) is automatically installed by the dotfiles. On first setup, you'll need to install the configured plugins:
- Start tmux:
tmux - Press
prefix + I(capital i) to install plugins - Use
prefix + Ctrl-fto launch the tmux-fzf fuzzy finder for sessions/windows/panes
Press prefix + Ctrl-f to access:
- Session switching - Fuzzy find across all tmux sessions
- Window switching - Jump to any window in any session
- Pane switching - Navigate to any pane
- Additional tools - Commands, keybindings, clipboard, and process management
Run ./bin/update.sh anytime to:
- Update all package managers (Homebrew, rustup, uv)
- Re-run the deployment to catch any new configurations
- Upgrade all installed Homebrew packages
- Update TPM and tmux plugins (run
prefix + Uin tmux)
- macOS (tested on recent versions) or Arch Linux
- Internet connection for downloading tools
- Admin privileges for some installations