Container-first, multi-shell dotfiles for Linux power users with a Kubernetes & container workflow focus
- Overview
- Philosophy
- Features
- Quick Start
- Shell Strategy
- Project Structure
- Development Workflow
- Design Choices
- Future Plans
This is my personal dotfiles repository, designed to provide a consistent development environment across:
- Linux workstations (Fedora/Universal Blue)
- macOS (work machine, minimal support)
- Container environments (Distrobox, Podman, Docker)
- Future: Kubernetes debug pods (coming soon!)
Target Audience: Linux power users who work with containers, Kubernetes, and need a portable, consistent shell environment anywhere.
Everything is designed to run in userspace and work seamlessly in containerized environments:
- โ No system-level configuration - Works on immutable OSes (Fedora Atomic, etc.)
- โ Portable - Same environment in Distrobox, Podman, or bare metal
- โ Self-contained - All tools managed via mise, no root required
- โ Future-proof - Ready for Kubernetes debug containers
Different shells for different tasks, not just preference:
- ๐ Fish - Primary interactive shell (user-friendly, modern)
- ๐ Bash - Scripting and automation (universal, POSIX)
- ๐ Nushell - Data processing (structured pipelines)
- ๐ Zsh - macOS compatibility bridge (shares Bash config)
This repo does not manage:
- โ Host NetworkManager configurations
- โ Systemd services (host level)
- โ Server/system administration
- โ Package installation on host
This keeps configs portable and safe for immutable operating systems.
- Editor: Neovim (Lua-based configuration)
- Terminal: Wezterm with sessionizer
- Shell Tools: Starship prompt, Carapace completions, eza, bat, fzf
- Version Management: mise (formerly rtx)
- Git Hooks: hk (high-performance, mise-integrated)
-
Container Runtime: Podman + Distrobox
-
K8s Tools: kubectl, krew plugins
-
Custom kubeconfig manager (Fish shell)
# Automatically merges configs from ~/.kube/clusters/ set-kubeconfig # Load all configs isolate-kubeconfig path # Use single config append-kubeconfig path # Add to current context store-kubeconfig path # Save to clusters dir
- 1Password CLI integration via Chezmoi templates
- Personal use only (not for team/shared secrets)
- CLI Tools: Homebrew (general use), mise (project-specific versions)
- GUI Apps: Flatpak (Linux only)
- Containers: Podman + Distrobox exported apps
- Language Tools: Managed by mise per-project (Python, Node, Go, Rust, etc.)
- Niri (Wayland tiling compositor)
- KDE Plasma (full desktop)
# Initialize and apply dotfiles
chezmoi init rwaltr
chezmoi applyComing Soon: Auto-install mise, Homebrew, and Flatpaks during init
# Self-contained installer (downloads chezmoi)
sh -c "$(curl -fsLS https://raw.githubusercontent.com/rwaltr/dotfiles/master/install.sh)"# Quick ephemeral environment (Docker/Podman)
podman run -it --rm fedora:latest bash -c "
dnf install -y git curl &&
sh -c \"\$(curl -fsLS https://raw.githubusercontent.com/rwaltr/dotfiles/master/install.sh)\"
"
# Persistent Distrobox environment (Linux only)
distrobox create --image ghcr.io/ublue-os/bluefin-cli:latest --name dev
distrobox enter dev
chezmoi init rwaltr && chezmoi applyEach shell serves a specific purpose based on its strengths:
Use for: Daily interactive work, command exploration, quick tasks
Strengths:
- Modern, intuitive syntax
- Excellent tab completion
- Syntax highlighting out-of-the-box
- User-friendly interactive features
Example Config:
# ~/.config/fish/config.fish
# Modular configuration via conf.d/*.fish
# Custom functions in functions/*.fishUse for: Scripts, automation, CI/CD, compatibility
Strengths:
- Available everywhere (including containers, minimal systems)
- POSIX compatible
- Industry standard for scripting
Example Structure:
# Modular configuration in ~/.config/bashrc.d/
# Loaded alphabetically:
# - 0.*.sh (core setup)
# - *.sh (tool configs)Use for: Log analysis, data transformation, structured pipelines
Strengths:
- Structured data (tables, records)
- Type-aware commands
- SQL-like queries
Example Use Case:
# Parse JSON logs with structured queries
cat logs.json | from json | where status == 500 | lengthUse for: macOS compatibility (when Fish isn't an option)
Strengths:
- Shares Bash configuration (POSIX compatible)
- Minimal maintenance
- Smoother transition for Bash users
Configuration:
- Sources from
~/.config/bashrc.d/(shared with Bash) - Minimal Zsh-specific setup
dotfiles/
โโโ .chezmoiroot # Points source to home/ directory
โโโ install.sh # Bootstrap script (no chezmoi required)
โโโ mise.toml # Development tools & tasks
โโโ hk.pkl # Git hooks configuration
โโโ .markdownlint-cli2.jsonc # Markdown linting rules
โ
โโโ home/ # Chezmoi source directory (becomes ~/)
โ โโโ .chezmoiexternal.yaml # External asset management
โ โโโ .chezmoiignore # Files to skip
โ โ
โ โโโ dot_config/
โ โ โโโ fish/ # Fish shell (15+ modular files)
โ โ โ โโโ config.fish
โ โ โ โโโ conf.d/ # Auto-loaded configs
โ โ โ โโโ functions/
โ โ โ
โ โ โโโ bashrc.d/ # Modular Bash configs (17 files)
โ โ โ โโโ 0.*.sh # Core (load order)
โ โ โ โโโ *.sh # Tool-specific
โ โ โ
โ โ โโโ nvim/ # Neovim Lua config
โ โ โโโ wezterm/ # Terminal config
โ โ โโโ mise/ # mise configuration
โ โ โโโ ...
โ โ
โ โโโ dot_local/
โ โโโ bin/ # Custom scripts
โ
โโโ AGENTS.md # Comprehensive context for AI agents
โโโ README.md # This file
mise.toml- Development tools, linting/formatting taskshk.pkl- Git pre-commit/pre-push hooks (delegates to mise)AGENTS.md- Deep dive for AI coding assistants (like pi!)home/dot_config/bashrc.d/- 17 modular Bash scriptshome/dot_config/fish/- 15+ Fish shell modules
Powered by mise tasks and hk git hooks:
# Run all linters
mise run lint
# Run all formatters
mise run format
# Individual linters
mise run lint:shell # shellcheck
mise run lint:fish # fish --no-execute
mise run lint:lua # stylua
mise run lint:yaml # yamllint
mise run lint:toml # taplo
mise run lint:markdown # markdownlint-cli2
# Individual formatters
mise run format:shell # shfmt
mise run format:lua # stylua
mise run format:toml # taploAutomatically runs linters on commit/push:
# Install hooks (one-time)
mise run hk:install
# Manually check staged files
mise run check
# Auto-fix issues in staged files
mise run hk:fix
# Hooks run automatically
git commit -m "feat: something" # โ linters run here
# Skip hooks if needed (emergency only)
HK=0 git commit -m "emergency fix"How it works: hk delegates to mise run lint, ensuring git hooks and manual checks are identical.
# Check what would change
chezmoi diff
# Apply changes
chezmoi apply
# Edit a file (opens in $EDITOR)
chezmoi edit ~/.config/fish/config.fish
# Add a new file to management
chezmoi add ~/.config/newapp/config.toml
# Update from repository
chezmoi update
# See status
chezmoi status# Global tools via Homebrew (available everywhere)
brew install kubectl kubectx jq fzf ripgrep
# Project-specific versions via mise
cd ~/project
mise use node@20 python@3.12
# Or add to project's .mise.toml:
# [tools]
# node = "20"
# python = "3.12"
# Install tools
mise install
# Verify
mise listvs Nix: More complexity than needed for dotfiles alone. Chezmoi hits the sweet spot between:
- Simplicity: Templates, not a whole OS
- Power: Templating, external resources, secrets management
- Portability: Works on any system with a shell
vs Stow/bare git: Need templating for:
- Different configs per machine
- Secret injection from 1Password
- OS-specific sections
- Interactive Focus: 90% of shell time is interactive, not scripting
- Modern UX: Tab completion, syntax highlighting, better defaults
- Less Configuration: Works great out-of-the-box
- Still Use Bash: For scripts where portability matters
For project-specific version management:
- โ Version Management: Replaces asdf, nvm, rbenv, pyenv, etc. per-project
- โ Task Runner: Built-in make alternative
- โ Tool Installer: Downloads and manages CLI tools
- โ
Environment Management: Per-project tool versions via
.mise.toml
vs Homebrew: Homebrew is for global tools used everywhere (kubectl, jq, fzf, etc.), while mise handles per-project versions (Node 18 in project A, Node 20 in project B).
vs Homebrew: Homebrew is for global tools used everywhere (kubectl, jq, fzf, etc.), while mise handles per-project versions (Node 18 in project A, Node 20 in project B).
Goal: Run this environment anywhere:
- ๐ฅ๏ธ Workstation: Full setup with GUI tools
- ๐ฆ Container: Lightweight dev environment
- โธ๏ธ K8s Debug Pod: Familiar shell in production (future)
- ๐ macOS: Work machine compatibility
Benefits:
- No system pollution
- Immutable OS friendly
- Portable and reproducible
- Same environment everywhere
- Distrobox Assemble: Rebuild pi AI agent environment on any machine
- Auto-install during init: mise, Homebrew, Flatpaks
- Kubernetes debug container: Run dotfiles in
kubectl debugpods
- Wezterm sessionizer integration with pi agent for long-running tasks
- Container image: Pre-built Docker/Podman image with full setup
- macOS improvements: Better Homebrew integration
- Nushell integration: Deeper data processing workflows
- AGENTS.md - Comprehensive guide for AI coding assistants
- Full project philosophy
- File-by-file breakdown
- Configuration patterns
- Chezmoi workflows
- Development tasks
This is a personal repository, but feel free to:
- ๐ก Open issues with questions
- ๐ Report bugs or suggest improvements
- โญ Star if you find it useful!
Personal use. Feel free to use as inspiration or starting point for your own dotfiles.
Built with: Chezmoi โข mise โข Fish โข Neovim โข Wezterm
